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/tex.h"
|
||||||
#include "lib/ivis_opengl/textdraw.h"
|
#include "lib/ivis_opengl/textdraw.h"
|
||||||
|
|
||||||
// pass in true to reset the palette too.
|
|
||||||
void iV_Reset()
|
void iV_Reset()
|
||||||
{
|
{
|
||||||
_TEX_INDEX = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void iV_ShutDown(void)
|
void iV_ShutDown(void)
|
||||||
|
|
|
@ -310,15 +310,13 @@ void pie_UploadDisplayBuffer()
|
||||||
|
|
||||||
bool pie_InitRadar(void)
|
bool pie_InitRadar(void)
|
||||||
{
|
{
|
||||||
radarTexture = _TEX_INDEX;
|
glGenTextures(1, &radarTexture);
|
||||||
glGenTextures(1, &_TEX_PAGE[_TEX_INDEX].id);
|
|
||||||
_TEX_INDEX++;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pie_ShutdownRadar(void)
|
bool pie_ShutdownRadar(void)
|
||||||
{
|
{
|
||||||
glDeleteTextures(1, &_TEX_PAGE[radarTexture].id);
|
glDeleteTextures(1, &radarTexture);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,7 +330,8 @@ void pie_DownLoadRadar(UDWORD *buffer, int width, int height, bool filter)
|
||||||
while (width > (w *= 2)) {}
|
while (width > (w *= 2)) {}
|
||||||
while (height > (h *= 2)) {}
|
while (height > (h *= 2)) {}
|
||||||
|
|
||||||
pie_SetTexturePage(radarTexture);
|
pie_SetTexturePage(TEXPAGE_EXTERN);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, radarTexture);
|
||||||
black = (char *)calloc(1, w * h * 4);
|
black = (char *)calloc(1, w * h * 4);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, black);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, black);
|
||||||
free(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. */
|
/** Display radar texture using the given height and width, depending on zoom level. */
|
||||||
void pie_RenderRadar(int x, int y, int width, int height)
|
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);
|
pie_SetRendMode(REND_ALPHA);
|
||||||
|
|
||||||
glColor4ubv(WZCOL_WHITE.vector);
|
glColor4ubv(WZCOL_WHITE.vector);
|
||||||
glBegin(GL_TRIANGLE_STRIP);
|
glBegin(GL_TRIANGLE_STRIP);
|
||||||
glTexCoord2f(0, 0); glVertex2f(x, y);
|
glTexCoord2f(0, 0); glVertex2f(x, y);
|
||||||
|
|
|
@ -66,7 +66,6 @@ bool pie_Initialise(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
pie_MatInit();
|
pie_MatInit();
|
||||||
_TEX_INDEX = 0;
|
|
||||||
|
|
||||||
rendSurface.width = pie_GetVideoBufferWidth();
|
rendSurface.width = pie_GetVideoBufferWidth();
|
||||||
rendSurface.height = pie_GetVideoBufferHeight();
|
rendSurface.height = pie_GetVideoBufferHeight();
|
||||||
|
|
|
@ -397,7 +397,7 @@ void pie_ActivateFallback(SHADER_MODE, iIMDShape* shape, PIELIGHT teamcolour, PI
|
||||||
// TU1
|
// TU1
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glEnable(GL_TEXTURE_2D);
|
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);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||||
|
|
||||||
// TU1 RGB
|
// TU1 RGB
|
||||||
|
@ -482,12 +482,12 @@ void pie_ActivateShader(SHADER_MODE shaderMode, iIMDShape* shape, PIELIGHT teamc
|
||||||
if (maskpage != iV_TEX_INVALID)
|
if (maskpage != iV_TEX_INVALID)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[maskpage].id);
|
glBindTexture(GL_TEXTURE_2D, pie_Texture(maskpage));
|
||||||
}
|
}
|
||||||
if (normalpage != iV_TEX_INVALID)
|
if (normalpage != iV_TEX_INVALID)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE2);
|
glActiveTexture(GL_TEXTURE2);
|
||||||
glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[normalpage].id);
|
glBindTexture(GL_TEXTURE_2D, pie_Texture(normalpage));
|
||||||
}
|
}
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
|
||||||
|
@ -614,8 +614,7 @@ void pie_SetTexturePage(SDWORD num)
|
||||||
{
|
{
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
}
|
}
|
||||||
ASSERT_OR_RETURN(, num < iV_TEX_MAX, "Index out of bounds: %d", num);
|
glBindTexture(GL_TEXTURE_2D, pie_Texture(num));
|
||||||
glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[num].id);
|
|
||||||
}
|
}
|
||||||
rendStates.texPage = num;
|
rendStates.texPage = num;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,17 +28,42 @@
|
||||||
#include "lib/ivis_opengl/piepalette.h"
|
#include "lib/ivis_opengl/piepalette.h"
|
||||||
#include "lib/ivis_opengl/png_util.h"
|
#include "lib/ivis_opengl/png_util.h"
|
||||||
|
|
||||||
|
#include <QList>
|
||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
|
|
||||||
iTexPage _TEX_PAGE[iV_TEX_MAX];
|
struct iTexPage
|
||||||
unsigned int _TEX_INDEX;
|
{
|
||||||
|
char name[iV_TEXNAME_MAX];
|
||||||
|
GLuint id;
|
||||||
|
};
|
||||||
|
|
||||||
|
QList<iTexPage> _TEX_PAGE;
|
||||||
|
|
||||||
static void pie_PrintLoadedTextures(void);
|
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
|
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;
|
void *bmp;
|
||||||
bool scaleDown = false;
|
bool scaleDown = false;
|
||||||
GLint minfilter;
|
GLint minfilter;
|
||||||
|
iTexPage tex;
|
||||||
|
int page = -1;
|
||||||
|
|
||||||
|
ASSERT(s && filename, "Bad input parameter");
|
||||||
|
|
||||||
/* Have we already loaded this one? Should not happen here. */
|
/* 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)
|
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++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use first unused slot */
|
page = _TEX_PAGE.size();
|
||||||
for (i = slot; i < iV_TEX_MAX && _TEX_PAGE[i].name[0] != '\0'; i++) {}
|
debug(LOG_TEXTURE, "pie_AddTexPage: %s page=%d", filename, page);
|
||||||
|
|
||||||
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 */
|
/* Stick the name into the tex page structures */
|
||||||
sstrcpy(_TEX_PAGE[i].name, filename);
|
sstrcpy(tex.name, filename);
|
||||||
|
|
||||||
glGenTextures(1, &_TEX_PAGE[i].id);
|
glGenTextures(1, &tex.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);
|
_TEX_PAGE.append(tex);
|
||||||
|
|
||||||
|
pie_SetTexturePage(page);
|
||||||
|
|
||||||
width = s->width;
|
width = s->width;
|
||||||
height = s->height;
|
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);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||||
|
|
||||||
/* Send back the texpage number so we can store it in the IMD */
|
/* Send back the texpage number so we can store it in the IMD */
|
||||||
|
return page;
|
||||||
_TEX_INDEX++;
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -214,11 +233,8 @@ void pie_MakeTexPageTCMaskName(char * filename)
|
||||||
*/
|
*/
|
||||||
static void pie_PrintLoadedTextures(void)
|
static void pie_PrintLoadedTextures(void)
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
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, "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, "%02d : %s", i, _TEX_PAGE[i].name);
|
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? */
|
/* Have we already loaded this one then? */
|
||||||
sstrcpy(path, filename);
|
sstrcpy(path, filename);
|
||||||
pie_MakeTexPageName(path);
|
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)
|
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;
|
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)
|
void pie_TexShutDown(void)
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
// TODO, lazy deletions for faster loading of next level
|
||||||
|
debug(LOG_TEXTURE, "Cleaning out %u textures", _TEX_PAGE.size());
|
||||||
while (i < _TEX_INDEX)
|
int _TEX_INDEX = _TEX_PAGE.size() - 1;
|
||||||
|
while (_TEX_INDEX > 0)
|
||||||
{
|
{
|
||||||
glDeleteTextures(1, &_TEX_PAGE[i].id);
|
glDeleteTextures(1, &_TEX_PAGE[_TEX_INDEX--].id);
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
_TEX_PAGE.clear();
|
||||||
debug(LOG_TEXTURE, "pie_TexShutDown successful - did free %u texture pages", i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pie_TexInit(void)
|
void pie_TexInit(void)
|
||||||
{
|
{
|
||||||
int i = 0;
|
debug(LOG_TEXTURE, "pie_TexInit successful");
|
||||||
|
|
||||||
while (i < iV_TEX_MAX) {
|
|
||||||
_TEX_PAGE[i].name[0] = '\0';
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
debug(LOG_TEXTURE, "pie_TexInit successful - initialized %d texture pages\n", i);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,6 @@
|
||||||
#include "lib/framework/opengl.h"
|
#include "lib/framework/opengl.h"
|
||||||
#include "png_util.h"
|
#include "png_util.h"
|
||||||
|
|
||||||
|
|
||||||
#define iV_TEX_MAX 255
|
|
||||||
#define iV_TEX_INVALID 0
|
#define iV_TEX_INVALID 0
|
||||||
#define iV_TEXNAME_MAX 64
|
#define iV_TEXNAME_MAX 64
|
||||||
|
|
||||||
|
@ -32,28 +30,9 @@
|
||||||
|
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
|
|
||||||
struct iTexPage
|
GLuint pie_Texture(int page);
|
||||||
{
|
int pie_NumberOfPages();
|
||||||
char name[iV_TEXNAME_MAX];
|
int pie_ReserveTexture(const char *name);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
|
|
||||||
|
|
|
@ -1433,7 +1433,7 @@ void drawWater(void)
|
||||||
|
|
||||||
// second texture unit
|
// second texture unit
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, iV_NativeTexID(iV_GetTexture("page-81")));
|
glBindTexture(GL_TEXTURE_2D, pie_Texture(iV_GetTexture("page-81")));
|
||||||
glError();
|
glError();
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
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);
|
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",
|
if (texPage == pie_NumberOfPages())
|
||||||
// texPage, firstPage, name, level, width, height, count, TILES_IN_PAGE, _TEX_INDEX);
|
|
||||||
if (texPage == _TEX_INDEX)
|
|
||||||
{
|
{
|
||||||
// We need to create a new texture page; create it and increase texture table to store it
|
// We need to create a new texture page; create it and increase texture table to store it
|
||||||
glGenTextures(1, &_TEX_PAGE[texPage].id);
|
pie_ReserveTexture(name);
|
||||||
_TEX_INDEX++;
|
|
||||||
}
|
}
|
||||||
terrainPage = texPage;
|
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);
|
pie_SetTexturePage(texPage);
|
||||||
|
|
||||||
// Specify first and last mipmap level to be used
|
// Specify first and last mipmap level to be used
|
||||||
|
@ -127,9 +118,8 @@ bool texLoad(const char *fileName)
|
||||||
int texPage;
|
int texPage;
|
||||||
GLint glval;
|
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");
|
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
|
// store the filename so we can later determine which tileset we are using
|
||||||
|
@ -247,12 +237,12 @@ bool texLoad(const char *fileName)
|
||||||
xOffset = 0;
|
xOffset = 0;
|
||||||
yOffset = 0;
|
yOffset = 0;
|
||||||
debug(LOG_TEXTURE, "texLoad: Extra page added at %d for %s, was page %d, opengl id %u",
|
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);
|
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",
|
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
|
i /= 2; // halve the dimensions for the next series; OpenGL mipmaps start with largest at level zero
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue