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-861f7616d084master
parent
4b45e8e2e1
commit
0226604dbc
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
/*!
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
16
src/data.c
16
src/data.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue