]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rsurf.c
Enable GL_OES_framebuffer_object on Android - it was broken in Android 2.1 but that...
[xonotic/darkplaces.git] / gl_rsurf.c
index 72c5a472b936c48cc544512edc9739139af876e7..0bec0bde0c8adada5874f224afc06b37fdc9cfa0 100644 (file)
@@ -583,10 +583,7 @@ void R_Q1BSP_DrawSky(entity_render_t *ent)
 {
        if (ent->model == NULL)
                return;
-       if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(true, true, false, false, false);
-       else
-               R_DrawModelSurfaces(ent, true, true, false, false, false);
+       R_DrawModelSurfaces(ent, true, true, false, false, false);
 }
 
 void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent)
@@ -597,10 +594,7 @@ void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent)
        if (model == NULL)
                return;
 
-       if (ent == r_refdef.scene.worldentity)
-               RSurf_ActiveWorldEntity();
-       else
-               RSurf_ActiveModelEntity(ent, true, false, false);
+       RSurf_ActiveModelEntity(ent, true, false, false);
 
        surfaces = model->data_surfaces;
        flagsmask = MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION | MATERIALFLAG_CAMERA;
@@ -629,7 +623,7 @@ void R_Q1BSP_DrawAddWaterPlanes(entity_render_t *ent)
                                R_Water_AddWaterPlane(surfaces + j, n);
                }
        }
-       rsurface.entity = NULL; // used only by R_GetCurrentTexture and RSurf_ActiveWorldEntity/RSurf_ActiveModelEntity
+       rsurface.entity = NULL; // used only by R_GetCurrentTexture and RSurf_ActiveModelEntity
 }
 
 void R_Q1BSP_Draw(entity_render_t *ent)
@@ -637,10 +631,7 @@ void R_Q1BSP_Draw(entity_render_t *ent)
        dp_model_t *model = ent->model;
        if (model == NULL)
                return;
-       if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(false, true, false, false, false);
-       else
-               R_DrawModelSurfaces(ent, false, true, false, false, false);
+       R_DrawModelSurfaces(ent, false, true, false, false, false);
 }
 
 void R_Q1BSP_DrawDepth(entity_render_t *ent)
@@ -654,10 +645,7 @@ void R_Q1BSP_DrawDepth(entity_render_t *ent)
        GL_BlendFunc(GL_ONE, GL_ZERO);
        GL_DepthMask(true);
 //     R_Mesh_ResetTextureState();
-       if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(false, false, true, false, false);
-       else
-               R_DrawModelSurfaces(ent, false, false, true, false, false);
+       R_DrawModelSurfaces(ent, false, false, true, false, false);
        GL_ColorMask(r_refdef.view.colormask[0], r_refdef.view.colormask[1], r_refdef.view.colormask[2], 1);
 }
 
@@ -665,10 +653,7 @@ void R_Q1BSP_DrawDebug(entity_render_t *ent)
 {
        if (ent->model == NULL)
                return;
-       if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(false, false, false, true, false);
-       else
-               R_DrawModelSurfaces(ent, false, false, false, true, false);
+       R_DrawModelSurfaces(ent, false, false, false, true, false);
 }
 
 void R_Q1BSP_DrawPrepass(entity_render_t *ent)
@@ -676,10 +661,7 @@ void R_Q1BSP_DrawPrepass(entity_render_t *ent)
        dp_model_t *model = ent->model;
        if (model == NULL)
                return;
-       if (ent == r_refdef.scene.worldentity)
-               R_DrawWorldSurfaces(false, true, false, false, true);
-       else
-               R_DrawModelSurfaces(ent, false, true, false, false, true);
+       R_DrawModelSurfaces(ent, false, true, false, false, true);
 }
 
 typedef struct r_q1bsp_getlightinfo_s
@@ -704,6 +686,8 @@ typedef struct r_q1bsp_getlightinfo_s
        const unsigned char *pvs;
        qboolean svbsp_active;
        qboolean svbsp_insertoccluder;
+       qboolean noocclusion; // avoids PVS culling
+       qboolean frontsidecasting; // casts shadows from surfaces facing the light (otherwise ones facing away)
        int numfrustumplanes;
        const mplane_t *frustumplanes;
 }
@@ -734,7 +718,8 @@ static void R_Q1BSP_RecursiveGetLightInfo_BSP(r_q1bsp_getlightinfo_t *info, qboo
        const vec_t *v[3];
        float v2[3][3];
        qboolean insidebox;
-       qboolean frontsidecasting = r_shadow_frontsidecasting.integer != 0;
+       qboolean noocclusion = info->noocclusion;
+       qboolean frontsidecasting = info->frontsidecasting;
        qboolean svbspactive = info->svbsp_active;
        qboolean svbspinsertoccluder = info->svbsp_insertoccluder;
        const int *leafsurfaceindices;
@@ -824,7 +809,7 @@ static void R_Q1BSP_RecursiveGetLightInfo_BSP(r_q1bsp_getlightinfo_t *info, qboo
                        // leaf
                        leaf = (mleaf_t *)node;
 #if 1
-                       if (r_shadow_frontsidecasting.integer && info->pvs != NULL && !CHECKPVSBIT(info->pvs, leaf->clusterindex))
+                       if (!info->noocclusion && info->pvs != NULL && !CHECKPVSBIT(info->pvs, leaf->clusterindex))
                                continue;
 #endif
 #if 1
@@ -941,7 +926,7 @@ static void R_Q1BSP_RecursiveGetLightInfo_BSP(r_q1bsp_getlightinfo_t *info, qboo
                                                addedtris = true;
                                                if (castshadow)
                                                {
-                                                       if (currentmaterialflags & MATERIALFLAG_NOCULLFACE)
+                                                       if (noocclusion || (currentmaterialflags & MATERIALFLAG_NOCULLFACE))
                                                        {
                                                                // if the material is double sided we
                                                                // can't cull by direction
@@ -983,6 +968,8 @@ static void R_Q1BSP_RecursiveGetLightInfo_BIH(r_q1bsp_getlightinfo_t *info, cons
        int nodeleafindex;
        int currentmaterialflags;
        qboolean castshadow;
+       qboolean noocclusion = info->noocclusion;
+       qboolean frontsidecasting = info->frontsidecasting;
        msurface_t *surface;
        const int *e;
        const vec_t *v[3];
@@ -1042,13 +1029,13 @@ static void R_Q1BSP_RecursiveGetLightInfo_BIH(r_q1bsp_getlightinfo_t *info, cons
                                SETPVSBIT(info->outlighttrispvs, t);
                                if (castshadow)
                                {
-                                       if (currentmaterialflags & MATERIALFLAG_NOCULLFACE)
+                                       if (noocclusion || (currentmaterialflags & MATERIALFLAG_NOCULLFACE))
                                        {
                                                // if the material is double sided we
                                                // can't cull by direction
                                                SETPVSBIT(info->outshadowtrispvs, t);
                                        }
-                                       else if (r_shadow_frontsidecasting.integer)
+                                       else if (frontsidecasting)
                                        {
                                                // front side casting occludes backfaces,
                                                // so they are completely useless as both
@@ -1205,9 +1192,11 @@ static int R_Q1BSP_GetLightInfo_comparefunc(const void *ap, const void *bp)
 
 extern cvar_t r_shadow_sortsurfaces;
 
-void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs, unsigned char *visitingleafpvs, int numfrustumplanes, const mplane_t *frustumplanes)
+void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, vec3_t outmins, vec3_t outmaxs, int *outleaflist, unsigned char *outleafpvs, int *outnumleafspointer, int *outsurfacelist, unsigned char *outsurfacepvs, int *outnumsurfacespointer, unsigned char *outshadowtrispvs, unsigned char *outlighttrispvs, unsigned char *visitingleafpvs, int numfrustumplanes, const mplane_t *frustumplanes, qboolean noocclusion)
 {
        r_q1bsp_getlightinfo_t info;
+       info.frontsidecasting = r_shadow_frontsidecasting.integer != 0;
+       info.noocclusion = noocclusion || !info.frontsidecasting;
        VectorCopy(relativelightorigin, info.relativelightorigin);
        info.lightradius = lightradius;
        info.lightmins[0] = info.relativelightorigin[0] - info.lightradius;
@@ -1246,18 +1235,18 @@ void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, floa
        else
                memset(outshadowtrispvs, 0, (info.model->surfmesh.num_triangles + 7) >> 3);
        memset(outlighttrispvs, 0, (info.model->surfmesh.num_triangles + 7) >> 3);
-       if (info.model->brush.GetPVS && r_shadow_frontsidecasting.integer)
+       if (info.model->brush.GetPVS && !info.noocclusion)
                info.pvs = info.model->brush.GetPVS(info.model, info.relativelightorigin);
        else
                info.pvs = NULL;
-       RSurf_ActiveWorldEntity();
+       RSurf_ActiveModelEntity(r_refdef.scene.worldentity, false, false, false);
 
-       if (r_shadow_frontsidecasting.integer && r_shadow_compilingrtlight && r_shadow_realtime_world_compileportalculling.integer && info.model->brush.data_portals)
+       if (!info.noocclusion && r_shadow_compilingrtlight && r_shadow_realtime_world_compileportalculling.integer && info.model->brush.data_portals)
        {
                // use portal recursion for exact light volume culling, and exact surface checking
                Portal_Visibility(info.model, info.relativelightorigin, info.outleaflist, info.outleafpvs, &info.outnumleafs, info.outsurfacelist, info.outsurfacepvs, &info.outnumsurfaces, NULL, 0, true, info.lightmins, info.lightmaxs, info.outmins, info.outmaxs, info.outshadowtrispvs, info.outlighttrispvs, info.visitingleafpvs);
        }
-       else if (r_shadow_frontsidecasting.integer && r_shadow_realtime_dlight_portalculling.integer && info.model->brush.data_portals)
+       else if (!info.noocclusion && r_shadow_realtime_dlight_portalculling.integer && info.model->brush.data_portals)
        {
                // use portal recursion for exact light volume culling, but not the expensive exact surface checking
                Portal_Visibility(info.model, info.relativelightorigin, info.outleaflist, info.outleafpvs, &info.outnumleafs, info.outsurfacelist, info.outsurfacepvs, &info.outnumsurfaces, NULL, 0, r_shadow_realtime_dlight_portalculling.integer >= 2, info.lightmins, info.lightmaxs, info.outmins, info.outmaxs, info.outshadowtrispvs, info.outlighttrispvs, info.visitingleafpvs);
@@ -1268,10 +1257,10 @@ void R_Q1BSP_GetLightInfo(entity_render_t *ent, vec3_t relativelightorigin, floa
                // optionally using svbsp for exact culling of compiled lights
                // (or if the user enables dlight svbsp culling, which is mostly for
                //  debugging not actual use)
-               R_Q1BSP_CallRecursiveGetLightInfo(&info, (r_shadow_compilingrtlight ? r_shadow_realtime_world_compilesvbsp.integer : r_shadow_realtime_dlight_svbspculling.integer) != 0);
+               R_Q1BSP_CallRecursiveGetLightInfo(&info, !info.noocclusion && (r_shadow_compilingrtlight ? r_shadow_realtime_world_compilesvbsp.integer : r_shadow_realtime_dlight_svbspculling.integer) != 0);
        }
 
-       rsurface.entity = NULL; // used only by R_GetCurrentTexture and RSurf_ActiveWorldEntity/RSurf_ActiveModelEntity
+       rsurface.entity = NULL; // used only by R_GetCurrentTexture and RSurf_ActiveModelEntity
 
        // limit combined leaf box to light boundaries
        outmins[0] = max(info.outmins[0] - 1, info.lightmins[0]);
@@ -1511,7 +1500,7 @@ void R_Q1BSP_DrawLight(entity_render_t *ent, int numsurfaces, const int *surface
                                ;
                        // now figure out what to do with this particular range of surfaces
                        // VorteX: added MATERIALFLAG_NORTLIGHT
-                       if ((rsurface.texture->currentmaterialflags & (MATERIALFLAG_WALL | MATERIALFLAG_FULLBRIGHT | MATERIALFLAG_NORTLIGHT)) != MATERIALFLAG_WALL)
+                       if ((rsurface.texture->currentmaterialflags & (MATERIALFLAG_WALL | MATERIALFLAG_NORTLIGHT)) != MATERIALFLAG_WALL)
                                continue;
                        if (r_fb.water.renderingscene && (rsurface.texture->currentmaterialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION | MATERIALFLAG_CAMERA)))
                                continue;