mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-17 11:35:08 -04:00
Optimise tex ids overlay rendering (part 2)
This commit is contained in:
parent
feeaf9c7b5
commit
1d7bc6953f
88
src/Menus.c
88
src/Menus.c
@ -2980,17 +2980,16 @@ static void Overlay_MakeMainButtons(struct ButtonWidget* btns) {
|
||||
/*########################################################################################################################*
|
||||
*------------------------------------------------------TexIdsOverlay------------------------------------------------------*
|
||||
*#########################################################################################################################*/
|
||||
#define TEXID_OVERLAY_MAX_PER_PAGE (ATLAS2D_TILES_PER_ROW * ATLAS2D_TILES_PER_ROW)
|
||||
#define TEXID_OVERLAY_VERTICES_COUNT (TEXID_OVERLAY_MAX_PER_PAGE * 4)
|
||||
|
||||
static struct TexIdsOverlay {
|
||||
Screen_Body
|
||||
GfxResourceID dynamicVb;
|
||||
int xOffset, yOffset, tileSize, baseTexLoc;
|
||||
int xOffset, yOffset, tileSize, textVertices;
|
||||
struct TextAtlas idAtlas;
|
||||
struct TextWidget title;
|
||||
} TexIdsOverlay_Instance;
|
||||
#define TEXIDS_MAX_VERTICES (TEXTWIDGET_MAX + 4 * ATLAS1D_MAX_ATLASES)
|
||||
|
||||
#define TEXIDS_MAX_PER_PAGE (ATLAS2D_TILES_PER_ROW * ATLAS2D_TILES_PER_ROW)
|
||||
#define TEXIDS_TEXT_VERTICES (10 * 4 + 90 * 8 + 412 * 12) /* '0'-'9' + '10'-'99' + '100'-'511' */
|
||||
#define TEXIDS_MAX_VERTICES (TEXTWIDGET_MAX + 4 * ATLAS1D_MAX_ATLASES + TEXIDS_TEXT_VERTICES)
|
||||
|
||||
static void TexIdsOverlay_Layout(void* screen) {
|
||||
struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen;
|
||||
@ -3011,7 +3010,6 @@ static void TexIdsOverlay_Layout(void* screen) {
|
||||
static void TexIdsOverlay_ContextLost(void* screen) {
|
||||
struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen;
|
||||
Screen_ContextLost(s);
|
||||
Gfx_DeleteDynamicVb(&s->dynamicVb);
|
||||
TextAtlas_Free(&s->idAtlas);
|
||||
}
|
||||
|
||||
@ -3022,7 +3020,6 @@ static void TexIdsOverlay_ContextRecreated(void* screen) {
|
||||
struct FontDesc textFont, titleFont;
|
||||
|
||||
Screen_CreateVb(screen);
|
||||
s->dynamicVb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, TEXID_OVERLAY_VERTICES_COUNT);
|
||||
Drawer2D_MakeFont(&textFont, 8, FONT_STYLE_NORMAL);
|
||||
Font_ReducePadding(&textFont, 4);
|
||||
TextAtlas_Make(&s->idAtlas, &chars, &textFont, &prefix);
|
||||
@ -3047,7 +3044,7 @@ static void TexIdsOverlay_BuildTerrain(struct TexIdsOverlay* s, VertexP3fT2fC4b*
|
||||
tex.Width = size; tex.Height = size;
|
||||
|
||||
for (row = 0; row < Atlas2D.RowsCount; row += ATLAS2D_TILES_PER_ROW) {
|
||||
for (i = 0; i < TEXID_OVERLAY_MAX_PER_PAGE; i++) {
|
||||
for (i = 0; i < TEXIDS_MAX_PER_PAGE; i++) {
|
||||
|
||||
tex.X = xOffset + Atlas2D_TileX(i) * size;
|
||||
tex.Y = s->yOffset + Atlas2D_TileY(i) * size;
|
||||
@ -3058,11 +3055,37 @@ static void TexIdsOverlay_BuildTerrain(struct TexIdsOverlay* s, VertexP3fT2fC4b*
|
||||
Gfx_Make2DQuad(&tex, PACKEDCOL_WHITE, ptr);
|
||||
}
|
||||
|
||||
baseLoc += TEXID_OVERLAY_MAX_PER_PAGE;
|
||||
baseLoc += TEXIDS_MAX_PER_PAGE;
|
||||
xOffset += size * ATLAS2D_TILES_PER_ROW;
|
||||
}
|
||||
}
|
||||
|
||||
static void TexIdsOverlay_BuildText(struct TexIdsOverlay* s, VertexP3fT2fC4b** ptr) {
|
||||
struct TextAtlas* idAtlas;
|
||||
VertexP3fT2fC4b* beg;
|
||||
int xOffset, size, row;
|
||||
int x, y, id = 0;
|
||||
|
||||
size = s->tileSize;
|
||||
xOffset = s->xOffset;
|
||||
idAtlas = &s->idAtlas;
|
||||
beg = *ptr;
|
||||
|
||||
for (row = 0; row < Atlas2D.RowsCount; row += ATLAS2D_TILES_PER_ROW) {
|
||||
idAtlas->tex.Y = s->yOffset + (size - idAtlas->tex.Height);
|
||||
|
||||
for (y = 0; y < ATLAS2D_TILES_PER_ROW; y++) {
|
||||
for (x = 0; x < ATLAS2D_TILES_PER_ROW; x++) {
|
||||
idAtlas->curX = xOffset + size * x + 3; /* offset text by 3 pixels */
|
||||
TextAtlas_AddInt(idAtlas, id++, ptr);
|
||||
}
|
||||
idAtlas->tex.Y += size;
|
||||
}
|
||||
xOffset += size * ATLAS2D_TILES_PER_ROW;
|
||||
}
|
||||
s->textVertices = (int)(*ptr - beg);
|
||||
}
|
||||
|
||||
static void TexIdsOverlay_BuildMesh(void* screen) {
|
||||
struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen;
|
||||
VertexP3fT2fC4b* data;
|
||||
@ -3074,6 +3097,7 @@ static void TexIdsOverlay_BuildMesh(void* screen) {
|
||||
|
||||
Widget_BuildMesh(&s->title, ptr);
|
||||
TexIdsOverlay_BuildTerrain(s, ptr);
|
||||
TexIdsOverlay_BuildText(s, ptr);
|
||||
Gfx_UnlockDynamicVb(s->vb);
|
||||
}
|
||||
|
||||
@ -3088,38 +3112,10 @@ static int TexIdsOverlay_RenderTerrain(struct TexIdsOverlay* s, int offset) {
|
||||
return offset;
|
||||
}
|
||||
|
||||
static void TexIdsOverlay_RenderTextOverlay(struct TexIdsOverlay* s) {
|
||||
VertexP3fT2fC4b vertices[TEXID_OVERLAY_VERTICES_COUNT];
|
||||
VertexP3fT2fC4b* ptr = vertices;
|
||||
struct TextAtlas* idAtlas;
|
||||
int size, count;
|
||||
int x, y, id;
|
||||
|
||||
size = s->tileSize;
|
||||
idAtlas = &s->idAtlas;
|
||||
idAtlas->tex.Y = s->yOffset + (size - idAtlas->tex.Height);
|
||||
|
||||
for (y = 0; y < ATLAS2D_TILES_PER_ROW; y++) {
|
||||
for (x = 0; x < ATLAS2D_TILES_PER_ROW; x++) {
|
||||
idAtlas->curX = s->xOffset + size * x + 3; /* offset text by 3 pixels */
|
||||
id = x + y * ATLAS2D_TILES_PER_ROW;
|
||||
TextAtlas_AddInt(idAtlas, id + s->baseTexLoc, &ptr);
|
||||
}
|
||||
|
||||
idAtlas->tex.Y += size;
|
||||
if ((y % 4) != 3) continue;
|
||||
Gfx_BindTexture(idAtlas->tex.ID);
|
||||
|
||||
count = (int)(ptr - vertices);
|
||||
Gfx_UpdateDynamicVb_IndexedTris(s->dynamicVb, vertices, count);
|
||||
ptr = vertices;
|
||||
}
|
||||
}
|
||||
|
||||
static void TexIdsOverlay_OnAtlasChanged(void* screen) {
|
||||
struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen;
|
||||
s->dirty = true;
|
||||
/* Atlas may have 256 or 512 textures, which changes xOffset */
|
||||
/* Atlas may have 256 or 512 textures, which changes s->xOffset */
|
||||
/* This can resize the position of the 'pages', so just re-layout */
|
||||
TexIdsOverlay_Layout(screen);
|
||||
}
|
||||
@ -3142,7 +3138,7 @@ static void TexIdsOverlay_Free(void* screen) {
|
||||
|
||||
static void TexIdsOverlay_Render(void* screen, double delta) {
|
||||
struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen;
|
||||
int rows, offset = 0, origXOffset;
|
||||
int offset = 0;
|
||||
|
||||
Menu_RenderBounds();
|
||||
Gfx_SetTexturing(true);
|
||||
@ -3153,16 +3149,8 @@ static void TexIdsOverlay_Render(void* screen, double delta) {
|
||||
offset = Widget_Render2(&s->title, offset);
|
||||
offset = TexIdsOverlay_RenderTerrain(s, offset);
|
||||
|
||||
origXOffset = s->xOffset;
|
||||
s->baseTexLoc = 0;
|
||||
|
||||
for (rows = Atlas2D.RowsCount; rows > 0; rows -= ATLAS2D_TILES_PER_ROW) {
|
||||
TexIdsOverlay_RenderTextOverlay(s);
|
||||
s->xOffset += s->tileSize * ATLAS2D_TILES_PER_ROW;
|
||||
s->baseTexLoc += ATLAS2D_TILES_PER_ROW * ATLAS2D_TILES_PER_ROW;
|
||||
}
|
||||
|
||||
s->xOffset = origXOffset;
|
||||
Gfx_BindTexture(s->idAtlas.tex.ID);
|
||||
Gfx_DrawVb_IndexedTris_Range(s->textVertices, offset);
|
||||
Gfx_SetTexturing(false);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user