Use a hash table for finding Polymer buckets

git-svn-id: https://svn.eduke32.com/eduke32@5479 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2015-12-23 04:05:39 +00:00
parent 242b6bf870
commit 61059816b8
2 changed files with 14 additions and 10 deletions

View file

@ -2206,24 +2206,26 @@ static void polymer_emptybuckets(void)
prcanbucket = 0; prcanbucket = 0;
} }
static hashtable_t h_buckets ={ 2048, NULL };
static _prbucket* polymer_findbucket(int16_t tilenum, char pal) static _prbucket* polymer_findbucket(int16_t tilenum, char pal)
{ {
_prbucket *bucketptr = prbuckethead; char propstr[16];
Bsprintf(propstr, "%d_%d", tilenum, pal);
_prbucket *bucketptr = prbuckethead ? (_prbucket *)hash_find(&h_buckets, propstr) : NULL;
// find bucket // find bucket
while (bucketptr != NULL)
{
if (bucketptr->tilenum == tilenum && bucketptr->pal == pal)
break;
bucketptr = bucketptr->next;
}
// no buckets or no bucket found, create one // no buckets or no bucket found, create one
if (bucketptr == NULL) if (bucketptr == NULL || (intptr_t)bucketptr == -1)
{ {
bucketptr = (_prbucket *)Xmalloc(sizeof (_prbucket)); bucketptr = (_prbucket *)Xmalloc(sizeof (_prbucket));
if (h_buckets.items == NULL)
hash_init(&h_buckets);
// insert, since most likely to use same pattern next frame // insert, since most likely to use same pattern next frame
// will need to reorder by MRU first every once in a while // will need to reorder by MRU first every once in a while
// or move to hashing lookup // or move to hashing lookup
@ -2238,6 +2240,8 @@ static _prbucket* polymer_findbucket(int16_t tilenum, char pal)
bucketptr->count = 0; bucketptr->count = 0;
bucketptr->buffersize = 1024; bucketptr->buffersize = 1024;
bucketptr->indices = (GLuint *)Xmalloc(bucketptr->buffersize * sizeof(GLuint)); bucketptr->indices = (GLuint *)Xmalloc(bucketptr->buffersize * sizeof(GLuint));
hash_add(&h_buckets, propstr, (intptr_t)bucketptr, 1);
} }
return bucketptr; return bucketptr;

View file

@ -5778,7 +5778,7 @@ void polymost_initosdfuncs(void)
{ "r_pr_verbosity", "verbosity level of the polymer renderer", (void *) &pr_verbosity, CVAR_INT, 0, 3 }, { "r_pr_verbosity", "verbosity level of the polymer renderer", (void *) &pr_verbosity, CVAR_INT, 0, 3 },
{ "r_pr_wireframe", "toggles wireframe mode", (void *) &pr_wireframe, CVAR_INT | CVAR_NOSAVE, 0, 1 }, { "r_pr_wireframe", "toggles wireframe mode", (void *) &pr_wireframe, CVAR_INT | CVAR_NOSAVE, 0, 1 },
{ "r_pr_vbos", "contols Vertex Buffer Object usage. 0: no VBOs. 1: VBOs for map data. 2: VBOs for model data.", (void *) &pr_vbos, CVAR_INT | CVAR_RESTARTVID, 0, 2 }, { "r_pr_vbos", "contols Vertex Buffer Object usage. 0: no VBOs. 1: VBOs for map data. 2: VBOs for model data.", (void *) &pr_vbos, CVAR_INT | CVAR_RESTARTVID, 0, 2 },
{ "r_pr_buckets", "controls batching of primitives. 0: no batching. 1: buckets of materials.", (void *)&pr_buckets, CVAR_BOOL | CVAR_NOSAVE, 0, 1 }, { "r_pr_buckets", "controls batching of primitives. 0: no batching. 1: buckets of materials.", (void *)&pr_buckets, CVAR_BOOL | CVAR_NOSAVE | CVAR_RESTARTVID, 0, 1 },
{ "r_pr_gpusmoothing", "toggles model animation interpolation", (void *)&pr_gpusmoothing, CVAR_INT, 0, 1 }, { "r_pr_gpusmoothing", "toggles model animation interpolation", (void *)&pr_gpusmoothing, CVAR_INT, 0, 1 },
{ "r_pr_overrideparallax", "overrides parallax mapping scale and bias values with values from the pr_parallaxscale and pr_parallaxbias cvars; use it to fine-tune DEF tokens", (void *) &pr_overrideparallax, CVAR_BOOL | CVAR_NOSAVE, 0, 1 }, { "r_pr_overrideparallax", "overrides parallax mapping scale and bias values with values from the pr_parallaxscale and pr_parallaxbias cvars; use it to fine-tune DEF tokens", (void *) &pr_overrideparallax, CVAR_BOOL | CVAR_NOSAVE, 0, 1 },
{ "r_pr_parallaxscale", "overriden parallax mapping offset scale", (void *) &pr_parallaxscale, CVAR_FLOAT | CVAR_NOSAVE, -10, 10 }, { "r_pr_parallaxscale", "overriden parallax mapping offset scale", (void *) &pr_parallaxscale, CVAR_FLOAT | CVAR_NOSAVE, -10, 10 },