Remove hard-coded restriction on number of texture pages that can be used.

master
Per Inge Mathisen 2012-12-26 20:42:00 +01:00
parent 38a443ab55
commit e48052ee83
8 changed files with 70 additions and 103 deletions

View File

@ -23,10 +23,8 @@
#include "lib/ivis_opengl/tex.h"
#include "lib/ivis_opengl/textdraw.h"
// pass in true to reset the palette too.
void iV_Reset()
{
_TEX_INDEX = 0;
}
void iV_ShutDown(void)

View File

@ -310,15 +310,13 @@ void pie_UploadDisplayBuffer()
bool pie_InitRadar(void)
{
radarTexture = _TEX_INDEX;
glGenTextures(1, &_TEX_PAGE[_TEX_INDEX].id);
_TEX_INDEX++;
glGenTextures(1, &radarTexture);
return true;
}
bool pie_ShutdownRadar(void)
{
glDeleteTextures(1, &_TEX_PAGE[radarTexture].id);
glDeleteTextures(1, &radarTexture);
return true;
}
@ -332,7 +330,8 @@ void pie_DownLoadRadar(UDWORD *buffer, int width, int height, bool filter)
while (width > (w *= 2)) {}
while (height > (h *= 2)) {}
pie_SetTexturePage(radarTexture);
pie_SetTexturePage(TEXPAGE_EXTERN);
glBindTexture(GL_TEXTURE_2D, radarTexture);
black = (char *)calloc(1, w * h * 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, black);
free(black);
@ -359,9 +358,9 @@ void pie_DownLoadRadar(UDWORD *buffer, int width, int height, bool filter)
/** Display radar texture using the given height and width, depending on zoom level. */
void pie_RenderRadar(int x, int y, int width, int height)
{
pie_SetTexturePage(radarTexture);
pie_SetTexturePage(TEXPAGE_EXTERN);
glBindTexture(GL_TEXTURE_2D, radarTexture);
pie_SetRendMode(REND_ALPHA);
glColor4ubv(WZCOL_WHITE.vector);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0, 0); glVertex2f(x, y);

View File

@ -66,7 +66,6 @@ bool pie_Initialise(void)
}
pie_MatInit();
_TEX_INDEX = 0;
rendSurface.width = pie_GetVideoBufferWidth();
rendSurface.height = pie_GetVideoBufferHeight();

View File

@ -397,7 +397,7 @@ void pie_ActivateFallback(SHADER_MODE, iIMDShape* shape, PIELIGHT teamcolour, PI
// TU1
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[shape->tcmaskpage].id);
glBindTexture(GL_TEXTURE_2D, pie_Texture(shape->tcmaskpage));
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
// TU1 RGB
@ -482,12 +482,12 @@ void pie_ActivateShader(SHADER_MODE shaderMode, iIMDShape* shape, PIELIGHT teamc
if (maskpage != iV_TEX_INVALID)
{
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[maskpage].id);
glBindTexture(GL_TEXTURE_2D, pie_Texture(maskpage));
}
if (normalpage != iV_TEX_INVALID)
{
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[normalpage].id);
glBindTexture(GL_TEXTURE_2D, pie_Texture(normalpage));
}
glActiveTexture(GL_TEXTURE0);
@ -614,8 +614,7 @@ void pie_SetTexturePage(SDWORD num)
{
glEnable(GL_TEXTURE_2D);
}
ASSERT_OR_RETURN(, num < iV_TEX_MAX, "Index out of bounds: %d", num);
glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[num].id);
glBindTexture(GL_TEXTURE_2D, pie_Texture(num));
}
rendStates.texPage = num;
}

View File

@ -28,17 +28,42 @@
#include "lib/ivis_opengl/piepalette.h"
#include "lib/ivis_opengl/png_util.h"
#include <QList>
#include "screen.h"
//*************************************************************************
iTexPage _TEX_PAGE[iV_TEX_MAX];
unsigned int _TEX_INDEX;
struct iTexPage
{
char name[iV_TEXNAME_MAX];
GLuint id;
};
QList<iTexPage> _TEX_PAGE;
static void pie_PrintLoadedTextures(void);
//*************************************************************************
GLuint pie_Texture(int page)
{
return _TEX_PAGE[page].id;
}
int pie_NumberOfPages()
{
return _TEX_PAGE.size();
}
// Add a new texture page to the list
int pie_ReserveTexture(const char *name)
{
iTexPage tex;
glGenTextures(1, &tex.id);
sstrcpy(tex.name, name);
_TEX_PAGE.append(tex);
return _TEX_PAGE.size() - 1;
}
/**************************************************************************
Add an image buffer given in s as a new texture page in the texture
@ -57,9 +82,13 @@ int pie_AddTexPage(iV_Image *s, const char* filename, int slot, int maxTextureSi
void *bmp;
bool scaleDown = false;
GLint minfilter;
iTexPage tex;
int page = -1;
ASSERT(s && filename, "Bad input parameter");
/* Have we already loaded this one? Should not happen here. */
while (i < _TEX_INDEX)
while (i < _TEX_PAGE.size())
{
if (strncmp(filename, _TEX_PAGE[i].name, iV_TEXNAME_MAX) == 0)
{
@ -71,24 +100,17 @@ int pie_AddTexPage(iV_Image *s, const char* filename, int slot, int maxTextureSi
i++;
}
/* 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);
page = _TEX_PAGE.size();
debug(LOG_TEXTURE, "pie_AddTexPage: %s page=%d", filename, page);
/* Stick the name into the tex page structures */
sstrcpy(_TEX_PAGE[i].name, filename);
sstrcpy(tex.name, filename);
glGenTextures(1, &_TEX_PAGE[i].id);
// FIXME: This function is used instead of glBindTexture, but we're juggling with difficult to trace global state here. Look into pie_SetTexturePage's definition for details.
pie_SetTexturePage(i);
glGenTextures(1, &tex.id);
_TEX_PAGE.append(tex);
pie_SetTexturePage(page);
width = s->width;
height = s->height;
@ -161,10 +183,7 @@ int pie_AddTexPage(iV_Image *s, const char* filename, int slot, int maxTextureSi
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
/* Send back the texpage number so we can store it in the IMD */
_TEX_INDEX++;
return i;
return page;
}
@ -214,11 +233,8 @@ void pie_MakeTexPageTCMaskName(char * filename)
*/
static void pie_PrintLoadedTextures(void)
{
unsigned int i = 0;
debug(LOG_ERROR, "Available texture pages in memory (%d out of %d max):", _TEX_INDEX, iV_TEX_MAX);
for ( i = 0; i < iV_TEX_MAX && _TEX_PAGE[i].name[0] != '\0'; i++ )
debug(LOG_ERROR, "Texture pages in memory: %u", _TEX_PAGE.size());
for (int i = 0; i < _TEX_PAGE.size() && _TEX_PAGE[i].name[0] != '\0'; i++ )
{
debug(LOG_ERROR, "%02d : %s", i, _TEX_PAGE[i].name);
}
@ -243,7 +259,7 @@ int iV_GetTexture(const char *filename)
/* Have we already loaded this one then? */
sstrcpy(path, filename);
pie_MakeTexPageName(path);
for (i = 0; i < iV_TEX_MAX; i++)
for (i = 0; i < _TEX_PAGE.size(); i++)
{
if (strncmp(path, _TEX_PAGE[i].name, iV_TEXNAME_MAX) == 0)
{
@ -290,34 +306,21 @@ int pie_ReplaceTexPage(iV_Image *s, const char *texPage, int maxTextureSize, boo
return i;
}
/*
Alex - fixed this so it doesn't try to free up the memory if it got the page from resource
handler - this is because the resource handler will deal with freeing it, and in all probability
will have already done so by the time this is called, thus avoiding an 'already freed' moan.
*/
void pie_TexShutDown(void)
{
unsigned int i = 0;
while (i < _TEX_INDEX)
// TODO, lazy deletions for faster loading of next level
debug(LOG_TEXTURE, "Cleaning out %u textures", _TEX_PAGE.size());
int _TEX_INDEX = _TEX_PAGE.size() - 1;
while (_TEX_INDEX > 0)
{
glDeleteTextures(1, &_TEX_PAGE[i].id);
i++;
glDeleteTextures(1, &_TEX_PAGE[_TEX_INDEX--].id);
}
debug(LOG_TEXTURE, "pie_TexShutDown successful - did free %u texture pages", i);
_TEX_PAGE.clear();
}
void pie_TexInit(void)
{
int i = 0;
while (i < iV_TEX_MAX) {
_TEX_PAGE[i].name[0] = '\0';
i++;
}
debug(LOG_TEXTURE, "pie_TexInit successful - initialized %d texture pages\n", i);
debug(LOG_TEXTURE, "pie_TexInit successful");
}

View File

@ -23,8 +23,6 @@
#include "lib/framework/opengl.h"
#include "png_util.h"
#define iV_TEX_MAX 255
#define iV_TEX_INVALID 0
#define iV_TEXNAME_MAX 64
@ -32,28 +30,9 @@
//*************************************************************************
struct iTexPage
{
char name[iV_TEXNAME_MAX];
GLuint id;
};
//*************************************************************************
extern unsigned int _TEX_INDEX;
extern iTexPage _TEX_PAGE[iV_TEX_MAX];
//*************************************************************************
static inline char * iV_TexName(SDWORD pageNum)
{
return _TEX_PAGE[pageNum].name;
}
static inline GLuint iV_NativeTexID(SDWORD pageNum)
{
return _TEX_PAGE[pageNum].id;
}
GLuint pie_Texture(int page);
int pie_NumberOfPages();
int pie_ReserveTexture(const char *name);
//*************************************************************************

View File

@ -1433,7 +1433,7 @@ void drawWater(void)
// second texture unit
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, iV_NativeTexID(iV_GetTexture("page-81")));
glBindTexture(GL_TEXTURE_2D, pie_Texture(iV_GetTexture("page-81")));
glError();
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

View File

@ -78,21 +78,12 @@ static int newPage(const char *name, int level, int width, int height, int count
{
int texPage = firstPage + ((count + 1) / TILES_IN_PAGE);
// debug(LOG_TEXTURE, "newPage: texPage=%d firstPage=%d %s %d (%d,%d) (count %d + 1) / %d _TEX_INDEX=%u",
// texPage, firstPage, name, level, width, height, count, TILES_IN_PAGE, _TEX_INDEX);
if (texPage == _TEX_INDEX)
if (texPage == pie_NumberOfPages())
{
// We need to create a new texture page; create it and increase texture table to store it
glGenTextures(1, &_TEX_PAGE[texPage].id);
_TEX_INDEX++;
pie_ReserveTexture(name);
}
terrainPage = texPage;
ASSERT(_TEX_INDEX > texPage, "newPage: Index too low (%d > %d)", _TEX_INDEX, texPage);
ASSERT(_TEX_INDEX < iV_TEX_MAX, "Too many texture pages used");
sstrcpy(_TEX_PAGE[texPage].name, name);
pie_SetTexturePage(texPage);
// Specify first and last mipmap level to be used
@ -127,9 +118,8 @@ bool texLoad(const char *fileName)
int texPage;
GLint glval;
firstPage = _TEX_INDEX;
firstPage = pie_NumberOfPages();
ASSERT_OR_RETURN(false, _TEX_INDEX < iV_TEX_MAX, "Too many texture pages used");
ASSERT_OR_RETURN(false, MIPMAP_MAX == TILE_WIDTH && MIPMAP_MAX == TILE_HEIGHT, "Bad tile sizes");
// store the filename so we can later determine which tileset we are using
@ -247,12 +237,12 @@ bool texLoad(const char *fileName)
xOffset = 0;
yOffset = 0;
debug(LOG_TEXTURE, "texLoad: Extra page added at %d for %s, was page %d, opengl id %u",
k, partialPath, texPage, (unsigned int)_TEX_PAGE[texPage].id);
k, partialPath, texPage, (unsigned)pie_Texture(texPage));
texPage = newPage(fileName, j, xSize, ySize, k);
}
}
debug(LOG_TEXTURE, "texLoad: Found %d textures for %s mipmap level %d, added to page %d, opengl id %u",
k, partialPath, i, texPage, (unsigned int)_TEX_PAGE[texPage].id);
k, partialPath, i, texPage, (unsigned)pie_Texture(texPage));
i /= 2; // halve the dimensions for the next series; OpenGL mipmaps start with largest at level zero
}