Fix wrong texture pages selected for various models. Closes bug #9629.

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@2307 4a71c877-e1ca-e34f-864e-861f7616d084
master
Per Inge Mathisen 2007-08-01 15:06:23 +00:00
parent 4b45e8e2e1
commit 0226604dbc
4 changed files with 45 additions and 39 deletions

View File

@ -33,8 +33,6 @@ static unsigned short LoadTextureFile(const char *FileName, iTexture *pSprite)
{
unsigned int i;
debug(LOG_TEXTURE, "LoadTextureFile: %s", FileName);
ASSERT(resPresent("IMGPAGE", FileName), "Texture file \"%s\" not preloaded.", FileName);
*pSprite = *(iTexture*)resGetData("IMGPAGE", FileName);
@ -51,7 +49,7 @@ static unsigned short LoadTextureFile(const char *FileName, iTexture *pSprite)
}
}
return pie_AddTexPage(pSprite, FileName);
return pie_AddTexPage(pSprite, FileName, 0);
}
static inline IMAGEFILE* iV_AllocImageFile(size_t NumTPages, size_t NumImages)

View File

@ -53,8 +53,8 @@ extern int iV_GetTexture(const char *filename);
extern void iV_unloadImage(iV_Image *image);
extern unsigned int iV_getPixelFormat(const iV_Image *image);
extern int pie_ReloadTexPage(const char *texpageName, const char *fileName);
extern int pie_AddTexPage(iV_Image* s, const char *filename);
extern int pie_ReplaceTexPage(iV_Image *s, const char *texPage);
extern int pie_AddTexPage(iV_Image *s, const char *filename, int slot);
extern void pie_TexInit(void);
/*!

View File

@ -41,6 +41,8 @@
iTexPage _TEX_PAGE[iV_TEX_MAX];
unsigned int _TEX_INDEX;
static void pie_PrintLoadedTextures(void);
//*************************************************************************
@ -49,35 +51,39 @@ unsigned int _TEX_INDEX;
table. We check first if the given image has already been loaded,
as a sanity check (should never happen). The texture numbers are
stored in a special texture table, not in the resource system, for
some unknown reason.
some unknown reason. Start looking for an available slot in the
texture table at the given slot number.
Returns the texture number of the image.
**************************************************************************/
int pie_AddTexPage(iV_Image * s, const char* filename)
int pie_AddTexPage(iV_Image *s, const char* filename, int slot)
{
unsigned int i = 0;
debug(LOG_TEXTURE, "pie_AddTexPage: %s page=%d", filename, _TEX_INDEX);
assert(s != NULL);
/* Have we already loaded this one? (Should generally not happen here.) */
while (i < _TEX_INDEX) {
if (strncmp(filename, _TEX_PAGE[i].name, iV_TEXNAME_MAX) == 0) {
// this happens with terrain for some reason, which is necessary
debug(LOG_TEXTURE, "pie_AddTexPage: %s loaded again", filename);
/* Have we already loaded this one? Should not happen here. */
while (i < _TEX_INDEX)
{
if (strncmp(filename, _TEX_PAGE[i].name, iV_TEXNAME_MAX) == 0)
{
pie_PrintLoadedTextures();
}
ASSERT(strncmp(filename, _TEX_PAGE[i].name, iV_TEXNAME_MAX) != 0,
"pie_AddTexPage: %s loaded again! Already loaded as %s|%u", filename,
_TEX_PAGE[i].name, i);
i++;
}
/* Get next available texture page */
i = _TEX_INDEX;
/* Have we used up too many? */
if (_TEX_INDEX >= iV_TEX_MAX) {
debug(LOG_ERROR, "pie_AddTexPage: too many texture pages");
assert(!"too many texture pages");
return -1;
/* Use first unused slot */
for (i = slot; i < iV_TEX_MAX && _TEX_PAGE[i].name[0] != '\0'; i++);
if (i == _TEX_INDEX)
{
_TEX_INDEX++; // increase table
}
ASSERT(i != iV_TEX_MAX, "pie_AddTexPage: too many texture pages");
debug(LOG_TEXTURE, "pie_AddTexPage: %s page=%d", filename, _TEX_INDEX);
assert(s != NULL);
/* Stick the name into the tex page structures */
strncpy(_TEX_PAGE[i].name, filename, iV_TEXNAME_MAX);
@ -178,17 +184,27 @@ int iV_GetTexture(const char *filename)
}
int pie_ReloadTexPage(const char *texpageName, const char *fileName)
/**************************************************************************
WRF files may specify overrides for the textures on a map. This
is done through an ugly hack involving cutting the texture name
down to just "page-NN", where NN is the page number, and
replaceing the texture page with the same name if another file
with this prefix is loaded.
**************************************************************************/
int pie_ReplaceTexPage(iV_Image *s, const char *texPage)
{
int i = iV_GetTexture(texpageName);
int i = iV_GetTexture(texPage);
ASSERT(i >= 0, "pie_ReplaceTexPage: Cannot find any %s to replace!", texPage);
if (i < 0)
{
return -1;
}
debug(LOG_ERROR, "Reloading texture %s from index %d, max is %d (NOT REALLY DOING ANYTHING)",
texpageName, i, _TEX_INDEX);
glDeleteTextures(1, (GLuint *) &_TEX_PAGE[i].id);
debug(LOG_ERROR, "Reloading texture %s from index %d", texPage, i);
_TEX_PAGE[i].name[0] = '\0';
pie_AddTexPage(s, texPage, i);
return i;
}

View File

@ -724,28 +724,20 @@ static BOOL dataTexPageLoad(const char *fileName, void **ppData)
strncpy(texpage, GetLastResourceFilename(), MAX_PATH);
pie_MakeTexPageName(texpage);
dataImageLoad(fileName, ppData);
// see if this texture page has already been loaded
if (resPresent("TEXPAGE", texpage))
{
int id;
// replace the old texture page with the new one
debug(LOG_TEXTURE, "fileTexPageLoad: replacing %s with new texture %s", texpage, fileName);
id = pie_ReloadTexPage(texpage, fileName);
ASSERT( id >= 0, "pie_ReloadTexPage failed" );
*ppData = NULL;
(void) pie_ReplaceTexPage(*ppData, texpage);
}
else
{
debug(LOG_TEXTURE, "fileTexPageLoad: adding page %s with texture %s", texpage, fileName);
dataImageLoad(fileName, ppData);
pie_AddTexPage(*ppData, texpage);
SetLastResourceFilename(texpage);
(void) pie_AddTexPage(*ppData, texpage, 0);
}
return TRUE;