Remove hard-coded restriction on number of texture pages that can be used.
parent
38a443ab55
commit
e48052ee83
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -66,7 +66,6 @@ bool pie_Initialise(void)
|
|||
}
|
||||
|
||||
pie_MatInit();
|
||||
_TEX_INDEX = 0;
|
||||
|
||||
rendSurface.width = pie_GetVideoBufferWidth();
|
||||
rendSurface.height = pie_GetVideoBufferHeight();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
//*************************************************************************
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue