diff --git a/include/QF/model.h b/include/QF/model.h index f9dcac3a5..68af9e1f2 100644 --- a/include/QF/model.h +++ b/include/QF/model.h @@ -139,7 +139,8 @@ typedef struct glpoly_s { #define MAX_DLIGHTS 128 typedef struct msurface_s { - int visframe; // should be drawn when node is crossed + int _visframe; // should be drawn when node is crossed/ + // no longer used, see r_face_visframes int flags; plane_t *plane; diff --git a/include/r_internal.h b/include/r_internal.h index 36d07f1da..b3868c677 100644 --- a/include/r_internal.h +++ b/include/r_internal.h @@ -75,9 +75,10 @@ struct animation_s; void R_DrawAliasModel (struct entity_s *e); void R_MarkLeaves (struct mleaf_s *viewleaf, int *node_visframes, - int *leaf_visframes); + int *leaf_visframes, int *face_visframes); extern int *r_node_visframes; extern int *r_leaf_visframes; +extern int *r_face_visframes; void GL_SetPalette (void *data, const byte *palette); void GLSL_SetPalette (void *data, const byte *palette); diff --git a/libs/video/renderer/gl/gl_rmisc.c b/libs/video/renderer/gl/gl_rmisc.c index 24d818916..c2baac427 100644 --- a/libs/video/renderer/gl/gl_rmisc.c +++ b/libs/video/renderer/gl/gl_rmisc.c @@ -173,7 +173,7 @@ gl_R_NewScene (scene_t *scene) brush->leafs[i].efrags = NULL; // Force a vis update - R_MarkLeaves (0, 0, 0); + R_MarkLeaves (0, 0, 0, 0); R_ClearParticles (); diff --git a/libs/video/renderer/gl/gl_rsurf.c b/libs/video/renderer/gl/gl_rsurf.c index 39bd40cb0..b5988557d 100644 --- a/libs/video/renderer/gl/gl_rsurf.c +++ b/libs/video/renderer/gl/gl_rsurf.c @@ -612,9 +612,10 @@ visit_node (glbspctx_t *bctx, mnode_t *node, int side) side = (~side + 1) & SURF_PLANEBACK; // draw stuff if ((c = node->numsurfaces)) { - surf = bctx->brush->surfaces + node->firstsurface; - for (; c; c--, surf++) { - if (surf->visframe != r_visframecount) + int surf_id = node->firstsurface; + surf = bctx->brush->surfaces + surf_id; + for (; c; c--, surf++, surf_id++) { + if (r_face_visframes[surf_id] != r_visframecount) continue; // side is either 0 or SURF_PLANEBACK diff --git a/libs/video/renderer/glsl/glsl_bsp.c b/libs/video/renderer/glsl/glsl_bsp.c index 06d1b87a0..4a73e13e2 100644 --- a/libs/video/renderer/glsl/glsl_bsp.c +++ b/libs/video/renderer/glsl/glsl_bsp.c @@ -753,9 +753,10 @@ visit_node (glslbspctx_t *bctx, mnode_t *node, int side) // chain any visible surfaces on the node that face the camera. // not all nodes have any surfaces to draw (purely a split plane) if ((c = node->numsurfaces)) { - surf = bctx->brush->surfaces + node->firstsurface; - for (; c; c--, surf++) { - if (surf->visframe != r_visframecount) + int surf_id = node->firstsurface; + surf = bctx->brush->surfaces + surf_id; + for (; c; c--, surf++, surf_id++) { + if (r_face_visframes[surf_id] != r_visframecount) continue; // side is either 0 or SURF_PLANEBACK diff --git a/libs/video/renderer/glsl/glsl_main.c b/libs/video/renderer/glsl/glsl_main.c index 30f315a95..f8d6bf02d 100644 --- a/libs/video/renderer/glsl/glsl_main.c +++ b/libs/video/renderer/glsl/glsl_main.c @@ -199,7 +199,7 @@ glsl_R_NewScene (scene_t *scene) r_refdef.worldmodel = scene->worldmodel; // Force a vis update - R_MarkLeaves (0, 0, 0); + R_MarkLeaves (0, 0, 0, 0); R_ClearParticles (); glsl_R_RegisterTextures (scene->models, scene->num_models); diff --git a/libs/video/renderer/r_bsp.c b/libs/video/renderer/r_bsp.c index f430eea6b..4c4550649 100644 --- a/libs/video/renderer/r_bsp.c +++ b/libs/video/renderer/r_bsp.c @@ -47,7 +47,8 @@ static mleaf_t *r_oldviewleaf; static set_t *solid; void -R_MarkLeaves (mleaf_t *viewleaf, int *node_visframes, int *leaf_visframes) +R_MarkLeaves (mleaf_t *viewleaf, int *node_visframes, int *leaf_visframes, + int *face_visframes) { set_t *vis; int c; @@ -80,7 +81,7 @@ R_MarkLeaves (mleaf_t *viewleaf, int *node_visframes, int *leaf_visframes) if ((c = leaf->nummarksurfaces)) { mark = brush->marksurfaces + leaf->firstmarksurface; do { - (*mark)->visframe = r_visframecount; + face_visframes[*mark - brush->surfaces] = r_visframecount; mark++; } while (--c); } diff --git a/libs/video/renderer/r_light.c b/libs/video/renderer/r_light.c index 7dade022b..278710005 100644 --- a/libs/video/renderer/r_light.c +++ b/libs/video/renderer/r_light.c @@ -305,7 +305,8 @@ R_MarkLights (vec4f_t lightorigin, dlight_t *light, int lightnum, msurface_t **msurf = brush->marksurfaces + leaf->firstmarksurface; for (m = 0; m < leaf->nummarksurfaces; m++) { msurface_t *surf = *msurf++; - if (surf->visframe != r_visframecount) + int surf_id = surf - brush->surfaces; + if (r_face_visframes[surf_id] != r_visframecount) continue; mark_surfaces (surf, lightorigin, light, lightnum); } diff --git a/libs/video/renderer/r_screen.c b/libs/video/renderer/r_screen.c index 6bd37f9ad..f55531c0c 100644 --- a/libs/video/renderer/r_screen.c +++ b/libs/video/renderer/r_screen.c @@ -63,6 +63,7 @@ byte *draw_chars; // 8*8 graphic characters FIXME location qboolean r_cache_thrash; // set if surface cache is thrashing int *r_node_visframes; //FIXME per renderer int *r_leaf_visframes; //FIXME per renderer +int *r_face_visframes; //FIXME per renderer qboolean scr_skipupdate; static qboolean scr_initialized;// ready to draw @@ -284,7 +285,8 @@ SCR_UpdateScreen (transform_t *camera, double realtime, SCR_Func *scr_funcs) warp_buffer = r_funcs->create_frame_buffer (r_data->vid->width, r_data->vid->height); } - R_MarkLeaves (scr_scene->viewleaf, r_node_visframes, r_leaf_visframes); + R_MarkLeaves (scr_scene->viewleaf, r_node_visframes, r_leaf_visframes, + r_face_visframes); } R_PushDlights (vec3_origin); @@ -516,9 +518,12 @@ SCR_NewScene (scene_t *scene) scr_scene = scene; if (scene) { mod_brush_t *brush = &scr_scene->worldmodel->brush; - int size = (brush->numnodes + brush->modleafs) * sizeof (int); + int count = brush->numnodes + brush->modleafs + + brush->numsurfaces; + int size = count * sizeof (int); r_node_visframes = Hunk_AllocName (0, size, "visframes"); r_leaf_visframes = r_node_visframes + brush->numnodes; + r_face_visframes = r_leaf_visframes + brush->modleafs; r_funcs->set_fov (tan_fov_x, tan_fov_y); r_funcs->R_NewScene (scene); } else { diff --git a/libs/video/renderer/sw/sw_rbsp.c b/libs/video/renderer/sw/sw_rbsp.c index 1402bae5f..7ef8e20fd 100644 --- a/libs/video/renderer/sw/sw_rbsp.c +++ b/libs/video/renderer/sw/sw_rbsp.c @@ -384,9 +384,10 @@ visit_node (swbspctx_t *bctx, mnode_t *node, int side, int clipflags) side = (~side + 1) & SURF_PLANEBACK; // draw stuff if ((c = node->numsurfaces)) { - surf = brush->surfaces + node->firstsurface; - for (; c; c--, surf++) { - if (surf->visframe != r_visframecount) + int surf_id = node->firstsurface; + surf = brush->surfaces + surf_id; + for (; c; c--, surf++, surf_id++) { + if (r_face_visframes[surf_id] != r_visframecount) continue; // side is either 0 or SURF_PLANEBACK diff --git a/libs/video/renderer/sw/sw_rmain.c b/libs/video/renderer/sw/sw_rmain.c index 11f0f765b..b75c7efae 100644 --- a/libs/video/renderer/sw/sw_rmain.c +++ b/libs/video/renderer/sw/sw_rmain.c @@ -167,7 +167,7 @@ R_NewScene (scene_t *scene) R_InitSky (brush->skytexture); // Force a vis update - R_MarkLeaves (0, 0, 0); + R_MarkLeaves (0, 0, 0, 0); R_ClearParticles (); diff --git a/libs/video/renderer/vulkan/vulkan_bsp.c b/libs/video/renderer/vulkan/vulkan_bsp.c index e92f0d20e..2e4b0b05e 100644 --- a/libs/video/renderer/vulkan/vulkan_bsp.c +++ b/libs/video/renderer/vulkan/vulkan_bsp.c @@ -665,9 +665,10 @@ visit_node (mod_brush_t *brush, mnode_t *node, int side, vulkan_ctx_t *ctx) // chain any visible surfaces on the node that face the camera. // not all nodes have any surfaces to draw (purely a split plane) if ((c = node->numsurfaces)) { - surf = brush->surfaces + node->firstsurface; - for (; c; c--, surf++) { - if (surf->visframe != r_visframecount) + int surf_id = node->firstsurface; + surf = brush->surfaces + surf_id; + for (; c; c--, surf++, surf_id++) { + if (r_face_visframes[surf_id] != r_visframecount) continue; // side is either 0 or SURF_PLANEBACK diff --git a/libs/video/renderer/vulkan/vulkan_main.c b/libs/video/renderer/vulkan/vulkan_main.c index f7fb607c3..accd40842 100644 --- a/libs/video/renderer/vulkan/vulkan_main.c +++ b/libs/video/renderer/vulkan/vulkan_main.c @@ -142,7 +142,7 @@ Vulkan_NewScene (scene_t *scene, vulkan_ctx_t *ctx) r_refdef.worldmodel = scene->worldmodel; // Force a vis update - R_MarkLeaves (0, 0, 0); + R_MarkLeaves (0, 0, 0, 0); R_ClearParticles (); Vulkan_RegisterTextures (scene->models, scene->num_models, ctx);