]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - gl_rmain.c
merged q1bsp and q3bsp surface rendering
[xonotic/darkplaces.git] / gl_rmain.c
index b127b381bcb2b98a610117209af6417bfd85c865..de8327286ab0c1f77f09044010b86ec4ae7e3e07 100644 (file)
@@ -25,9 +25,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // used for dlight push checking and other things
 int r_framecount;
 
-// used for visibility checking
-qbyte r_pvsbits[(MAX_MAP_LEAFS+7)>>3];
-
 mplane_t frustum[4];
 
 matrix4x4_t r_identitymatrix;
@@ -109,6 +106,10 @@ cvar_t r_bloom_power = {CVAR_SAVE, "r_bloom_power", "4"};
 rtexturepool_t *r_main_texturepool;
 rtexture_t *r_bloom_texture_screen;
 rtexture_t *r_bloom_texture_bloom;
+rtexture_t *r_texture_blanknormalmap;
+rtexture_t *r_texture_white;
+rtexture_t *r_texture_black;
+rtexture_t *r_texture_notexture;
 
 void R_ModulateColors(float *in, float *out, int verts, float r, float g, float b)
 {
@@ -210,9 +211,49 @@ void FOG_registercvars(void)
 
 void gl_main_start(void)
 {
+       int x, y;
+       qbyte pix[16][16][4];
+       qbyte data[4];
        r_main_texturepool = R_AllocTexturePool();
        r_bloom_texture_screen = NULL;
        r_bloom_texture_bloom = NULL;
+       data[0] = 128; // normal X
+       data[1] = 128; // normal Y
+       data[2] = 255; // normal Z
+       data[3] = 128; // height
+       r_texture_blanknormalmap = R_LoadTexture2D(r_main_texturepool, "blankbump", 1, 1, data, TEXTYPE_RGBA, TEXF_PRECACHE, NULL);
+       data[0] = 255;
+       data[1] = 255;
+       data[2] = 255;
+       data[3] = 255;
+       r_texture_white = R_LoadTexture2D(r_main_texturepool, "blankwhite", 1, 1, data, TEXTYPE_RGBA, TEXF_PRECACHE, NULL);
+       data[0] = 0;
+       data[1] = 0;
+       data[2] = 0;
+       data[3] = 255;
+       r_texture_black = R_LoadTexture2D(r_main_texturepool, "blankblack", 1, 1, data, TEXTYPE_RGBA, TEXF_PRECACHE, NULL);
+       // this makes a light grey/dark grey checkerboard texture
+       for (y = 0;y < 16;y++)
+       {
+               for (x = 0;x < 16;x++)
+               {
+                       if ((y < 8) ^ (x < 8))
+                       {
+                               pix[y][x][0] = 128;
+                               pix[y][x][1] = 128;
+                               pix[y][x][2] = 128;
+                               pix[y][x][3] = 255;
+                       }
+                       else
+                       {
+                               pix[y][x][0] = 64;
+                               pix[y][x][1] = 64;
+                               pix[y][x][2] = 64;
+                               pix[y][x][3] = 255;
+                       }
+               }
+       }
+       r_texture_notexture = R_LoadTexture2D(mod_shared_texturepool, "notexture", 16, 16, &pix[0][0][0], TEXTYPE_RGBA, TEXF_MIPMAP, NULL);
 }
 
 void gl_main_shutdown(void)
@@ -220,6 +261,9 @@ void gl_main_shutdown(void)
        R_FreeTexturePool(&r_main_texturepool);
        r_bloom_texture_screen = NULL;
        r_bloom_texture_bloom = NULL;
+       r_texture_blanknormalmap = NULL;
+       r_texture_white = NULL;
+       r_texture_black = NULL;
 }
 
 extern void CL_ParseEntityLump(char *entitystring);
@@ -313,7 +357,7 @@ static float R_FarClip(vec3_t origin, vec3_t direction, vec_t startfarclip)
                R_FarClip_Box(r_refdef.worldmodel->normalmins, r_refdef.worldmodel->normalmaxs);
        for (i = 0;i < r_refdef.numentities;i++)
                R_FarClip_Box(r_refdef.entities[i]->mins, r_refdef.entities[i]->maxs);
-       
+
        return r_farclip_meshfarclip - r_farclip_directiondist;
 }
 
@@ -425,25 +469,48 @@ int R_CullBox(const vec3_t mins, const vec3_t maxs)
 
 static void R_MarkEntities (void)
 {
-       int i;
+       int i, renderimask;
        entity_render_t *ent;
 
        if (!r_drawentities.integer)
                return;
 
-       for (i = 0;i < r_refdef.numentities;i++)
+       renderimask = envmap ? (RENDER_EXTERIORMODEL | RENDER_VIEWMODEL) : (chase_active.integer ? 0 : RENDER_EXTERIORMODEL);
+       if (r_refdef.worldmodel && r_refdef.worldmodel->brush.BoxTouchingVisibleLeafs)
        {
-               ent = r_refdef.entities[i];
-               Mod_CheckLoaded(ent->model);
-               // some of the renderer still relies on origin...
-               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))))
-                       ent->visframe = r_framecount;
+               // worldmodel can check visibility
+               for (i = 0;i < r_refdef.numentities;i++)
+               {
+                       ent = r_refdef.entities[i];
+                       Mod_CheckLoaded(ent->model);
+                       // some of the renderer still relies on origin...
+                       Matrix4x4_OriginFromMatrix(&ent->matrix, ent->origin);
+                       // some of the renderer still relies on scale...
+                       ent->scale = Matrix4x4_ScaleFromMatrix(&ent->matrix);
+                       if (!(ent->flags & renderimask) && !R_CullBox(ent->mins, ent->maxs) && ((ent->effects & EF_NODEPTHTEST) || r_refdef.worldmodel->brush.BoxTouchingVisibleLeafs(r_refdef.worldmodel, r_worldleafvisible, ent->mins, ent->maxs)))
+                       {
+                               R_UpdateEntLights(ent);
+                               ent->visframe = r_framecount;
+                       }
+               }
+       }
+       else
+       {
+               // no worldmodel or it can't check visibility
+               for (i = 0;i < r_refdef.numentities;i++)
+               {
+                       ent = r_refdef.entities[i];
+                       Mod_CheckLoaded(ent->model);
+                       // some of the renderer still relies on origin...
+                       Matrix4x4_OriginFromMatrix(&ent->matrix, ent->origin);
+                       // some of the renderer still relies on scale...
+                       ent->scale = Matrix4x4_ScaleFromMatrix(&ent->matrix);
+                       if (!(ent->flags & renderimask) && !R_CullBox(ent->mins, ent->maxs) && (ent->effects & EF_NODEPTHTEST))
+                       {
+                               R_UpdateEntLights(ent);
+                               ent->visframe = r_framecount;
+                       }
+               }
        }
 }
 
@@ -739,7 +806,7 @@ void R_RenderView(void)
        GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 1);
        r_rtworld = r_shadow_realtime_world.integer;
        r_rtworldshadows = r_shadow_realtime_world_shadows.integer && gl_stencil;
-       r_rtdlight = r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer;
+       r_rtdlight = (r_shadow_realtime_world.integer || r_shadow_realtime_dlight.integer) && !gl_flashblend.integer;
        r_rtdlightshadows = r_rtdlight && (r_rtworld ? r_shadow_realtime_world_dlightshadows.integer : r_shadow_realtime_dlight_shadows.integer) && gl_stencil;
        r_lightmapintensity = r_rtworld ? r_shadow_realtime_world_lightmaps.value : 1;
 
@@ -765,7 +832,7 @@ void R_RenderView(void)
 
        R_BlendView();
        R_TimeReport("blendview");
-       
+
        GL_Scissor(0, 0, vid.realwidth, vid.realheight);
        GL_ScissorTest(false);
 }
@@ -795,8 +862,6 @@ void R_RenderScene(void)
 
        R_SkyStartFrame();
 
-       if (r_refdef.worldmodel && r_refdef.worldmodel->brush.FatPVS)
-               r_refdef.worldmodel->brush.FatPVS(r_refdef.worldmodel, r_vieworigin, 2, r_pvsbits, sizeof(r_pvsbits));
        R_WorldVisibility();
        R_TimeReport("worldvis");