diff --git a/include/r_local.h b/include/r_local.h index 7dc6e7af0..0999c6bc8 100644 --- a/include/r_local.h +++ b/include/r_local.h @@ -190,7 +190,9 @@ extern int c_faceclip; extern int r_polycount; extern int r_wholepolycount; -extern model_t *cl_worldmodel; +extern model_t *cl_worldmodel; +extern texture_t **r_texture_chains; +extern int r_num_texture_chains; extern int *pfrustum_indexes[4]; diff --git a/libs/video/renderer/gl/gl_rmisc.c b/libs/video/renderer/gl/gl_rmisc.c index bd4343084..a303cfbf5 100644 --- a/libs/video/renderer/gl/gl_rmisc.c +++ b/libs/video/renderer/gl/gl_rmisc.c @@ -38,6 +38,11 @@ static __attribute__ ((used)) const char rcsid[] = # include #endif +#if defined(_WIN32) && defined(HAVE_MALLOC_H) +#include +#endif + +#include #include #include "QF/cmd.h" @@ -61,6 +66,31 @@ static __attribute__ ((used)) const char rcsid[] = int r_init = 0; +texture_t **r_texture_chains; +int r_num_texture_chains; +static int max_texture_chains; + +static void +R_AddTexture (texture_t *tex) +{ + int i; + if (r_num_texture_chains == max_texture_chains) { + max_texture_chains += 64; + r_texture_chains = realloc (r_texture_chains, + max_texture_chains * sizeof (texture_t *)); + for (i = r_num_texture_chains; i < max_texture_chains; i++) + r_texture_chains[i] = 0; + } + r_texture_chains[r_num_texture_chains++] = tex; + tex->texturechain = NULL; + tex->texturechain_tail = &tex->texturechain; +} + +static void +R_ClearTextures (void) +{ + r_num_texture_chains = 0; +} /* R_Envmap_f @@ -182,6 +212,7 @@ R_NewMap (model_t *worldmodel, struct model_s **models, int num_models) // identify sky texture skytexturenum = -1; mirrortexturenum = -1; + R_ClearTextures (); for (i = 0; i < r_worldentity.model->numtextures; i++) { tex = r_worldentity.model->textures[i]; if (!tex) @@ -192,8 +223,7 @@ R_NewMap (model_t *worldmodel, struct model_s **models, int num_models) } if (!strncmp (tex->name, "window02_1", 10)) mirrortexturenum = i; - tex->texturechain = NULL; - tex->texturechain_tail = &tex->texturechain; + R_AddTexture (tex); } tex = r_notexture_mip; tex->texturechain = NULL; diff --git a/libs/video/renderer/gl/gl_rsurf.c b/libs/video/renderer/gl/gl_rsurf.c index 3903ff189..ecb169d3d 100644 --- a/libs/video/renderer/gl/gl_rsurf.c +++ b/libs/video/renderer/gl/gl_rsurf.c @@ -361,8 +361,8 @@ clear_texture_chains (void) int i; texture_t *tex; - for (i = 0; i < r_worldentity.model->numtextures; i++) { - tex = r_worldentity.model->textures[i]; + for (i = 0; i < r_num_texture_chains; i++) { + tex = r_texture_chains[i]; if (!tex) continue; tex->texturechain = NULL;