From 632b44267f8282b579ea56e9817489168d7b89ca Mon Sep 17 00:00:00 2001 From: havoc Date: Wed, 18 Feb 2004 14:37:36 +0000 Subject: [PATCH] now loads each cubemap only once, no matter how many lights use it git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3906 d7cf8633-e32d-0410-b094-e92efae38249 --- r_shadow.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/r_shadow.c b/r_shadow.c index bd0f1c0b..0e8b6ccc 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -1842,8 +1842,20 @@ vec3_t r_editlights_cursorlocation; static int lightpvsbytes; static qbyte lightpvs[(MAX_MAP_LEAFS + 7)/ 8]; + +typedef struct cubemapinfo_s +{ + char basename[64]; + rtexture_t *texture; +} +cubemapinfo_t; + +#define MAX_CUBEMAPS 128 +static int numcubemaps; +static cubemapinfo_t cubemaps[MAX_CUBEMAPS]; + //static char *suffix[6] = {"ft", "bk", "rt", "lf", "up", "dn"}; -typedef struct suffixinfo +typedef struct suffixinfo_s { char *suffix; int flipx, flipy, flipdiagonal; @@ -1925,8 +1937,23 @@ rtexture_t *R_Shadow_LoadCubemap(const char *basename) return cubemaptexture; } +rtexture_t *R_Shadow_Cubemap(const char *basename) +{ + int i; + for (i = 0;i < numcubemaps;i++) + if (!strcasecmp(cubemaps[i].basename, basename)) + return cubemaps[i].texture; + if (i >= MAX_CUBEMAPS) + return NULL; + numcubemaps++; + strcpy(cubemaps[i].basename, basename); + cubemaps[i].texture = R_Shadow_LoadCubemap(cubemaps[i].basename); + return cubemaps[i].texture; +} + void R_Shadow_FreeCubemaps(void) { + numcubemaps = 0; R_FreeTexturePool(&r_shadow_filters_texturepool); } @@ -1968,7 +1995,7 @@ void R_Shadow_NewWorldLight(vec3_t origin, float radius, vec3_t color, int style { e->cubemapname = Mem_Alloc(r_shadow_mempool, strlen(cubemapname) + 1); strcpy(e->cubemapname, cubemapname); - e->cubemap = R_Shadow_LoadCubemap(e->cubemapname); + e->cubemap = R_Shadow_Cubemap(e->cubemapname); } // FIXME: rewrite this to store ALL geometry into a cache in the light if (e->castshadows) -- 2.39.2