Add hint that vertices can be drawn as a flat sprite

Previously just rendering the UI in the 2D loading/generating menu took around 20 seconds in the 68x build. Now it's a very fast 15 seconds
This commit is contained in:
UnknownShadow200 2025-02-11 07:02:57 +11:00
parent 09751a8aa4
commit ffb790b1b5
26 changed files with 128 additions and 52 deletions

View File

@ -333,7 +333,8 @@ CC_API void Gfx_SetDynamicVbData(GfxResourceID vb, void* vertices, int vCount);
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------Vertex drawing-----------------------------------------------------* *------------------------------------------------------Vertex drawing-----------------------------------------------------*
*#########################################################################################################################*//* *#########################################################################################################################*/
/*
SUMMARY: SUMMARY:
Vertex drawing functions draw lines or triangles from the currently active vertex buffer Vertex drawing functions draw lines or triangles from the currently active vertex buffer
IMPLEMENTATION NOTES: IMPLEMENTATION NOTES:
@ -344,13 +345,19 @@ USAGE NOTES:
With the triangle drawing functions, the default bound index buffer With the triangle drawing functions, the default bound index buffer
is setup to draw groups of 2 triangles from 4 vertices (1 quad) is setup to draw groups of 2 triangles from 4 vertices (1 quad)
*/ */
typedef enum DrawHints_ {
DRAW_HINT_NONE = 0,
DRAW_HINT_SPRITE = 9,
} DrawHints;
/* Sets the format of the rendered vertices */ /* Sets the format of the rendered vertices */
CC_API void Gfx_SetVertexFormat(VertexFormat fmt); CC_API void Gfx_SetVertexFormat(VertexFormat fmt);
/* Renders vertices from the currently bound vertex buffer as lines */ /* Renders vertices from the currently bound vertex buffer as lines */
CC_API void Gfx_DrawVb_Lines(int verticesCount); CC_API void Gfx_DrawVb_Lines(int verticesCount);
/* Renders vertices from the currently bound vertex and index buffer as triangles */ /* Renders vertices from the currently bound vertex and index buffer as triangles */
/* NOTE: Offsets each index by startVertex */ /* NOTE: Offsets each index by startVertex */
CC_API void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex); CC_API void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints);
/* Renders vertices from the currently bound vertex and index buffer as triangles */ /* Renders vertices from the currently bound vertex and index buffer as triangles */
CC_API void Gfx_DrawVb_IndexedTris(int verticesCount); CC_API void Gfx_DrawVb_IndexedTris(int verticesCount);
/* Special case Gfx_DrawVb_IndexedTris_Range for map renderer */ /* Special case Gfx_DrawVb_IndexedTris_Range for map renderer */

View File

@ -984,7 +984,7 @@ static void SetVertexSource(int startVertex) {
// NOTE: Can't use GPUREG_VERTEX_OFFSET, it only works when drawing non-indexed arrays // NOTE: Can't use GPUREG_VERTEX_OFFSET, it only works when drawing non-indexed arrays
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
SetVertexSource(startVertex); SetVertexSource(startVertex);
C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount)); C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount));
} }

View File

@ -495,7 +495,7 @@ void Gfx_DrawVb_IndexedTris(int verticesCount) {
ID3D11DeviceContext_DrawIndexed(context, ICOUNT(verticesCount), 0, 0); ID3D11DeviceContext_DrawIndexed(context, ICOUNT(verticesCount), 0, 0);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
ID3D11DeviceContext_DrawIndexed(context, ICOUNT(verticesCount), 0, startVertex); ID3D11DeviceContext_DrawIndexed(context, ICOUNT(verticesCount), 0, startVertex);
} }

View File

@ -707,7 +707,7 @@ void Gfx_DrawVb_IndexedTris(int verticesCount) {
0, 0, verticesCount, 0, verticesCount >> 1); 0, 0, verticesCount, 0, verticesCount >> 1);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
IDirect3DDevice9_DrawIndexedPrimitive(device, D3DPT_TRIANGLELIST, IDirect3DDevice9_DrawIndexedPrimitive(device, D3DPT_TRIANGLELIST,
startVertex, 0, verticesCount, 0, verticesCount >> 1); startVertex, 0, verticesCount, 0, verticesCount >> 1);
} }

View File

@ -806,7 +806,7 @@ void Gfx_DrawVb_Lines(int verticesCount) {
//glDrawArrays(GL_LINES, 0, verticesCount); //glDrawArrays(GL_LINES, 0, verticesCount);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
void* src; void* src;
if (gfx_format == VERTEX_FORMAT_TEXTURED) { if (gfx_format == VERTEX_FORMAT_TEXTURED) {
src = gfx_vertices + startVertex * SIZEOF_VERTEX_TEXTURED; src = gfx_vertices + startVertex * SIZEOF_VERTEX_TEXTURED;

View File

@ -628,7 +628,7 @@ static void Draw_TexturedTriangles(int verticesCount, int startVertex) {
GX_End(); GX_End();
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
if (gfx_format == VERTEX_FORMAT_TEXTURED) { if (gfx_format == VERTEX_FORMAT_TEXTURED) {
Draw_TexturedTriangles(verticesCount, startVertex); Draw_TexturedTriangles(verticesCount, startVertex);
} else { } else {

View File

@ -327,7 +327,7 @@ void Gfx_DrawVb_Lines(int verticesCount) {
_glDrawArrays(GL_LINES, 0, verticesCount); _glDrawArrays(GL_LINES, 0, verticesCount);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
#ifdef CC_BUILD_GL11 #ifdef CC_BUILD_GL11
if (activeList != gl_DYNAMICLISTID) { glCallList(activeList); return; } if (activeList != gl_DYNAMICLISTID) { glCallList(activeList); return; }
#endif #endif

View File

@ -673,7 +673,7 @@ void Gfx_DrawVb_Lines(int verticesCount) {
glDrawArrays(GL_LINES, 0, verticesCount); glDrawArrays(GL_LINES, 0, verticesCount);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
gfx_setupVBRangeFunc(startVertex); gfx_setupVBRangeFunc(startVertex);
glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, NULL); glDrawElements(GL_TRIANGLES, ICOUNT(verticesCount), GL_UNSIGNED_SHORT, NULL);
} }

View File

@ -514,7 +514,7 @@ void Gfx_SetVertexFormat(VertexFormat fmt) {
void Gfx_DrawVb_Lines(int verticesCount) { void Gfx_DrawVb_Lines(int verticesCount) {
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
rspq_block_t* block = VB_GetCached(gfx_vb, startVertex, verticesCount); rspq_block_t* block = VB_GetCached(gfx_vb, startVertex, verticesCount);
if (block) { if (block) {

View File

@ -658,7 +658,7 @@ static void Draw_TexturedTriangles(int verticesCount, int startVertex) {
GFX_END = 0; GFX_END = 0;
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
if (gfx_format == VERTEX_FORMAT_TEXTURED) { if (gfx_format == VERTEX_FORMAT_TEXTURED) {
Draw_TexturedTriangles(verticesCount, startVertex); Draw_TexturedTriangles(verticesCount, startVertex);
} else { } else {

View File

@ -1094,7 +1094,7 @@ static void DrawQuads(int verticesCount, int startVertex) {
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
DrawQuads(verticesCount, startVertex); DrawQuads(verticesCount, startVertex);
} }

View File

@ -715,7 +715,7 @@ void Gfx_DrawVb_Lines(int verticesCount) {
//SetPrimitiveType(PRIM_LINE); //SetPrimitiveType(PRIM_LINE);
} /* TODO */ } /* TODO */
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
//SetPrimitiveType(PRIM_TRIANGLE); //SetPrimitiveType(PRIM_TRIANGLE);
DrawTriangles(verticesCount, startVertex); DrawTriangles(verticesCount, startVertex);
} }

View File

@ -710,25 +710,25 @@ void Gfx_DisableTextureOffset(void) {
void Gfx_SetVertexFormat(VertexFormat fmt) { void Gfx_SetVertexFormat(VertexFormat fmt) {
if (fmt == gfx_format) return; if (fmt == gfx_format) return;
gfx_format = fmt; gfx_format = fmt;
gfx_stride = strideSizes[fmt];/* TODO */ gfx_stride = strideSizes[fmt];
VP_SwitchActive(); VP_SwitchActive();
FP_SwitchActive(); FP_SwitchActive();
} }
void Gfx_DrawVb_Lines(int verticesCount) {/* TODO */ void Gfx_DrawVb_Lines(int verticesCount) {
rsxDrawVertexArray(context, GCM_TYPE_LINES, 0, verticesCount); rsxDrawVertexArray(context, GCM_TYPE_LINES, 0, verticesCount);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) {/* TODO */ void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
rsxDrawVertexArray(context, GCM_TYPE_QUADS, startVertex, verticesCount); rsxDrawVertexArray(context, GCM_TYPE_QUADS, startVertex, verticesCount);
} }
void Gfx_DrawVb_IndexedTris(int verticesCount) {/* TODO */ void Gfx_DrawVb_IndexedTris(int verticesCount) {
rsxDrawVertexArray(context, GCM_TYPE_QUADS, 0, verticesCount); rsxDrawVertexArray(context, GCM_TYPE_QUADS, 0, verticesCount);
} }
void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) {/* TODO */ void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) {
rsxDrawVertexArray(context, GCM_TYPE_QUADS, startVertex, verticesCount); rsxDrawVertexArray(context, GCM_TYPE_QUADS, startVertex, verticesCount);
} }
#endif #endif

View File

@ -440,7 +440,7 @@ void Gfx_DrawVb_Lines(int verticesCount) {
sceGuDrawArray(GU_LINES, gfx_fields, verticesCount, NULL, gfx_vertices); sceGuDrawArray(GU_LINES, gfx_fields, verticesCount, NULL, gfx_vertices);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
sceGuDrawArray(GU_TRIANGLES, gfx_fields | GU_INDEX_16BIT, ICOUNT(verticesCount), sceGuDrawArray(GU_TRIANGLES, gfx_fields | GU_INDEX_16BIT, ICOUNT(verticesCount),
gfx_indices, gfx_vertices + startVertex * gfx_stride); gfx_indices, gfx_vertices + startVertex * gfx_stride);
} }

View File

@ -1080,7 +1080,7 @@ void Gfx_DrawVb_Lines(int verticesCount) {
} }
// TODO probably wrong to offset index buffer // TODO probably wrong to offset index buffer
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
//Platform_Log2("DRAW1: %i, %i", &verticesCount, &startVertex); Thread_Sleep(100); //Platform_Log2("DRAW1: %i, %i", &verticesCount, &startVertex); Thread_Sleep(100);
sceGxmDraw(gxm_context, SCE_GXM_PRIMITIVE_TRIANGLES, sceGxmDraw(gxm_context, SCE_GXM_PRIMITIVE_TRIANGLES,
SCE_GXM_INDEX_FORMAT_U16, gfx_indices + ICOUNT(startVertex), ICOUNT(verticesCount)); SCE_GXM_INDEX_FORMAT_U16, gfx_indices + ICOUNT(startVertex), ICOUNT(verticesCount));

View File

@ -611,7 +611,7 @@ static void DrawTexturedQuads3D(int verticesCount, int startVertex) {
} }
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
if (gfx_rendering2D) { if (gfx_rendering2D) {
if (gfx_format == VERTEX_FORMAT_TEXTURED) { if (gfx_format == VERTEX_FORMAT_TEXTURED) {
DrawTexturedQuads2D(verticesCount, startVertex); DrawTexturedQuads2D(verticesCount, startVertex);

View File

@ -384,6 +384,65 @@ static CC_INLINE int FastFloor(float value) {
return valueI > value ? valueI - 1 : valueI; return valueI > value ? valueI - 1 : valueI;
} }
static void DrawSprite2D(Vertex* V0, Vertex* V1, Vertex* V2) {
int x0 = (int)V0->x, y0 = (int)V0->y;
int x1 = (int)V1->x, y1 = (int)V1->y;
int x2 = (int)V2->x, y2 = (int)V2->y;
int minX = min(x0, min(x1, x2));
int minY = min(y0, min(y1, y2));
int maxX = max(x0, max(x1, x2));
int maxY = max(y0, max(y1, y2));
int width = maxX - minX;
int height = maxY - minY;
// Reject triangles completely outside
if (maxX < 0 || minX > fb_maxX) return;
if (maxY < 0 || minY > fb_maxY) return;
int begTX = (int)(V0->u * curTexWidth);
int begTY = (int)(V0->v * curTexHeight);
// Perform scissoring
minX = max(minX, 0); maxX = min(maxX, fb_maxX);
minY = max(minY, 0); maxY = min(maxY, fb_maxY);
for (int y = minY; y <= maxY; y++)
{
int texY = (begTY + (y - minY)) & texHeightMask;
for (int x = minX; x <= maxX; x++)
{
int texX = (begTX + (x - minX)) & texWidthMask;
int texIndex = texY * curTexWidth + texX;
BitmapCol color = curTexPixels[texIndex];
int R, G, B, A;
A = BitmapCol_A(color);
if (gfx_alphaBlend && A == 0) continue;
int cb_index = y * cb_stride + x;
if (gfx_alphaBlend && A != 255) {
BitmapCol dst = colorBuffer[cb_index];
int dstR = BitmapCol_R(dst);
int dstG = BitmapCol_G(dst);
int dstB = BitmapCol_B(dst);
R = BitmapCol_R(color);
G = BitmapCol_G(color);
B = BitmapCol_B(color);
R = (R * A + dstR * (255 - A)) >> 8;
G = (G * A + dstG * (255 - A)) >> 8;
B = (B * A + dstB * (255 - A)) >> 8;
color = BitmapCol_Make(R, G, B, 0xFF);
}
colorBuffer[cb_index] = color;
}
}
}
#define edgeFunction(ax,ay, bx,by, cx,cy) (((bx) - (ax)) * ((cy) - (ay)) - ((by) - (ay)) * ((cx) - (ax))) #define edgeFunction(ax,ay, bx,by, cx,cy) (((bx) - (ax)) * ((cy) - (ay)) - ((by) - (ay)) * ((cx) - (ax)))
static void DrawTriangle2D(Vertex* V0, Vertex* V1, Vertex* V2) { static void DrawTriangle2D(Vertex* V0, Vertex* V1, Vertex* V2) {
@ -883,11 +942,21 @@ static void DrawClipped(int mask, Vertex* v0, Vertex* v1, Vertex* v2, Vertex* v3
} }
} }
void DrawQuads(int startVertex, int verticesCount) { void DrawQuads(int startVertex, int verticesCount, DrawHints hints) {
Vertex vertices[4]; Vertex vertices[4];
int j = startVertex; int j = startVertex;
if (gfx_rendering2D) { if (gfx_rendering2D && hints == DRAW_HINT_SPRITE) {
// 4 vertices = 1 quad = 2 triangles
for (int i = 0; i < verticesCount / 4; i++, j += 4)
{
TransformVertex2D(j + 0, &vertices[0]);
TransformVertex2D(j + 1, &vertices[1]);
TransformVertex2D(j + 2, &vertices[2]);
DrawSprite2D(&vertices[0], &vertices[1], &vertices[2]);
}
} else if (gfx_rendering2D) {
// 4 vertices = 1 quad = 2 triangles // 4 vertices = 1 quad = 2 triangles
for (int i = 0; i < verticesCount / 4; i++, j += 4) for (int i = 0; i < verticesCount / 4; i++, j += 4)
{ {
@ -934,16 +1003,16 @@ void Gfx_SetVertexFormat(VertexFormat fmt) {
void Gfx_DrawVb_Lines(int verticesCount) { } /* TODO */ void Gfx_DrawVb_Lines(int verticesCount) { } /* TODO */
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
DrawQuads(startVertex, verticesCount); DrawQuads(startVertex, verticesCount, hints);
} }
void Gfx_DrawVb_IndexedTris(int verticesCount) { void Gfx_DrawVb_IndexedTris(int verticesCount) {
DrawQuads(0, verticesCount); DrawQuads(0, verticesCount, DRAW_HINT_NONE);
} }
void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) {
DrawQuads(startVertex, verticesCount); DrawQuads(startVertex, verticesCount, DRAW_HINT_NONE);
} }

View File

@ -327,7 +327,7 @@ void Gfx_DrawVb_IndexedTris(int verticesCount) {
GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, 0, 1); GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, 0, 1);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
BindPendingTexture(); BindPendingTexture();
GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, startVertex, 1); GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, startVertex, 1);
} }

View File

@ -687,7 +687,7 @@ static void DrawIndexedVertices(int verticesCount, int startVertex) {
DrawArrays(NV097_SET_BEGIN_END_OP_QUADS, startVertex, verticesCount); DrawArrays(NV097_SET_BEGIN_END_OP_QUADS, startVertex, verticesCount);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
DrawIndexedVertices(verticesCount, startVertex); DrawIndexedVertices(verticesCount, startVertex);
} }

View File

@ -292,7 +292,7 @@ void Gfx_DrawVb_IndexedTris(int verticesCount) {
Xe_DrawPrimitive(xe, XE_PRIMTYPE_QUADLIST, 0, verticesCount >> 2); Xe_DrawPrimitive(xe, XE_PRIMTYPE_QUADLIST, 0, verticesCount >> 2);
} }
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) {
Platform_Log1("DRAW_TRIS_RANGE: %i", &verticesCount); Platform_Log1("DRAW_TRIS_RANGE: %i", &verticesCount);
Xe_DrawPrimitive(xe, XE_PRIMTYPE_QUADLIST, startVertex, verticesCount >> 2); Xe_DrawPrimitive(xe, XE_PRIMTYPE_QUADLIST, startVertex, verticesCount >> 2);
} }

View File

@ -159,7 +159,7 @@ void IsometricDrawer_Render(int count, int offset, int* state) {
/* Flush previous batch */ /* Flush previous batch */
Atlas1D_Bind(curIdx); Atlas1D_Bind(curIdx);
Gfx_DrawVb_IndexedTris_Range(batchLen, batchBeg); Gfx_DrawVb_IndexedTris_Range(batchLen, batchBeg, DRAW_HINT_NONE);
/* Reset for next batch */ /* Reset for next batch */
curIdx = state[i]; curIdx = state[i];
@ -168,5 +168,5 @@ void IsometricDrawer_Render(int count, int offset, int* state) {
} }
Atlas1D_Bind(curIdx); Atlas1D_Bind(curIdx);
Gfx_DrawVb_IndexedTris_Range(batchLen, batchBeg); Gfx_DrawVb_IndexedTris_Range(batchLen, batchBeg, DRAW_HINT_NONE);
} }

View File

@ -2565,7 +2565,7 @@ static int TexIdsOverlay_RenderTerrain(struct TexIdsOverlay* s, int offset) {
{ {
Atlas1D_Bind(i); Atlas1D_Bind(i);
Gfx_DrawVb_IndexedTris_Range(count, offset); Gfx_DrawVb_IndexedTris_Range(count, offset, DRAW_HINT_NONE);
offset += count; offset += count;
} }
return offset; return offset;
@ -2607,7 +2607,7 @@ static void TexIdsOverlay_Render(void* screen, float delta) {
offset = TexIdsOverlay_RenderTerrain(s, offset); offset = TexIdsOverlay_RenderTerrain(s, offset);
Gfx_BindTexture(s->idAtlas.tex.ID); Gfx_BindTexture(s->idAtlas.tex.ID);
Gfx_DrawVb_IndexedTris_Range(s->textVertices, offset); Gfx_DrawVb_IndexedTris_Range(s->textVertices, offset, DRAW_HINT_SPRITE);
} }
static int TexIdsOverlay_KeyDown(void* screen, int key, struct InputDevice* device) { static int TexIdsOverlay_KeyDown(void* screen, int key, struct InputDevice* device) {

View File

@ -972,9 +972,9 @@ static void HumanModel_DrawCore(struct Entity* e, struct ModelSet* model, cc_boo
if (opaqueBody) { if (opaqueBody) {
/* human model draws the body opaque so players can't have invisible skins */ /* human model draws the body opaque so players can't have invisible skins */
Gfx_SetAlphaTest(false); Gfx_SetAlphaTest(false);
Gfx_DrawVb_IndexedTris_Range(HUMAN_BASE_VERTICES, 0); Gfx_DrawVb_IndexedTris_Range(HUMAN_BASE_VERTICES, 0, DRAW_HINT_NONE);
Gfx_SetAlphaTest(true); Gfx_SetAlphaTest(true);
Gfx_DrawVb_IndexedTris_Range(num - HUMAN_BASE_VERTICES, HUMAN_BASE_VERTICES); Gfx_DrawVb_IndexedTris_Range(num - HUMAN_BASE_VERTICES, HUMAN_BASE_VERTICES, DRAW_HINT_NONE);
} else { } else {
Gfx_DrawVb_IndexedTris(num); Gfx_DrawVb_IndexedTris(num);
} }
@ -1789,7 +1789,7 @@ static void SheepModel_Draw(struct Entity* e) {
Model_UnlockVB(); Model_UnlockVB();
Gfx_DrawVb_IndexedTris(SHEEP_BODY_VERTICES); Gfx_DrawVb_IndexedTris(SHEEP_BODY_VERTICES);
Gfx_BindTexture(fur_tex.texID); Gfx_BindTexture(fur_tex.texID);
Gfx_DrawVb_IndexedTris_Range(SHEEP_FUR_VERTICES, SHEEP_BODY_VERTICES); Gfx_DrawVb_IndexedTris_Range(SHEEP_FUR_VERTICES, SHEEP_BODY_VERTICES, DRAW_HINT_NONE);
} }
static float SheepModel_GetNameY(struct Entity* e) { return 1.48125f; } static float SheepModel_GetNameY(struct Entity* e) { return 1.48125f; }
@ -2203,7 +2203,7 @@ static void BlockModel_DrawParts(void) {
/* Different 1D flush texture, flush current vertices */ /* Different 1D flush texture, flush current vertices */
Atlas1D_Bind(lastTexIndex); Atlas1D_Bind(lastTexIndex);
Gfx_DrawVb_IndexedTris_Range(count, offset); Gfx_DrawVb_IndexedTris_Range(count, offset, DRAW_HINT_NONE);
lastTexIndex = bModel_texIndices[i]; lastTexIndex = bModel_texIndices[i];
offset += count; offset += count;
@ -2213,7 +2213,7 @@ static void BlockModel_DrawParts(void) {
/* Leftover vertices */ /* Leftover vertices */
if (!count) return; if (!count) return;
Atlas1D_Bind(lastTexIndex); Atlas1D_Bind(lastTexIndex);
Gfx_DrawVb_IndexedTris_Range(count, offset); Gfx_DrawVb_IndexedTris_Range(count, offset, DRAW_HINT_NONE);
} }
static void BlockModel_Draw(struct Entity* e) { static void BlockModel_Draw(struct Entity* e) {

View File

@ -301,7 +301,7 @@ static void Terrain_Render(float t) {
if (!partCount) continue; if (!partCount) continue;
Atlas1D_Bind(i); Atlas1D_Bind(i);
Gfx_DrawVb_IndexedTris_Range(partCount, offset); Gfx_DrawVb_IndexedTris_Range(partCount, offset, DRAW_HINT_NONE);
offset += partCount; offset += partCount;
} }
} }

View File

@ -400,7 +400,7 @@ static void HUDScreen_Render(void* screen, float delta) {
} else if (IsOnlyChatActive() && Gui.ShowFPS) { } else if (IsOnlyChatActive() && Gui.ShowFPS) {
Widget_Render2(&s->line2, 8); Widget_Render2(&s->line2, 8);
Gfx_BindTexture(s->posAtlas.tex.ID); Gfx_BindTexture(s->posAtlas.tex.ID);
Gfx_DrawVb_IndexedTris_Range(s->posCount, 12 + HOTBAR_MAX_VERTICES); Gfx_DrawVb_IndexedTris_Range(s->posCount, 12 + HOTBAR_MAX_VERTICES, DRAW_HINT_SPRITE);
/* TODO swap these two lines back */ /* TODO swap these two lines back */
} }
@ -844,7 +844,7 @@ static void TabListOverlay_Render(void* screen, float delta) {
if (!s->textures[i].ID) continue; if (!s->textures[i].ID) continue;
Gfx_BindTexture(s->textures[i].ID); Gfx_BindTexture(s->textures[i].ID);
Gfx_DrawVb_IndexedTris_Range(4, offset); Gfx_DrawVb_IndexedTris_Range(4, offset, DRAW_HINT_SPRITE);
offset += 4; offset += 4;
} }
@ -1174,7 +1174,7 @@ static void ChatScreen_DrawChat(struct ChatScreen* s, float delta) {
if (Chat_GetLogTime(logIdx) + 10 < now) continue; if (Chat_GetLogTime(logIdx) + 10 < now) continue;
Gfx_BindTexture(tex.ID); Gfx_BindTexture(tex.ID);
Gfx_DrawVb_IndexedTris_Range(4, i * 4); Gfx_DrawVb_IndexedTris_Range(4, i * 4, DRAW_HINT_SPRITE);
} }
} }
@ -1947,7 +1947,7 @@ static void LoadingScreen_Render(void* screen, float delta) {
if (s->rows) { if (s->rows) {
loc = Block_Tex(BLOCK_DIRT, FACE_YMAX); loc = Block_Tex(BLOCK_DIRT, FACE_YMAX);
Atlas1D_Bind(Atlas1D_Index(loc)); Atlas1D_Bind(Atlas1D_Index(loc));
Gfx_DrawVb_IndexedTris(s->rows * 4); Gfx_DrawVb_IndexedTris_Range(s->rows * 4, 0, DRAW_HINT_NONE);
offset = s->rows * 4; offset = s->rows * 4;
} }

View File

@ -61,7 +61,7 @@ static int TextWidget_Render2(void* widget, int offset) {
struct TextWidget* w = (struct TextWidget*)widget; struct TextWidget* w = (struct TextWidget*)widget;
if (w->tex.ID) { if (w->tex.ID) {
Gfx_BindTexture(w->tex.ID); Gfx_BindTexture(w->tex.ID);
Gfx_DrawVb_IndexedTris_Range(4, offset); Gfx_DrawVb_IndexedTris_Range(4, offset, DRAW_HINT_SPRITE);
} }
return offset + 4; return offset + 4;
} }
@ -216,11 +216,11 @@ static int ButtonWidget_Render2(void* widget, int offset) {
struct ButtonWidget* w = (struct ButtonWidget*)widget; struct ButtonWidget* w = (struct ButtonWidget*)widget;
Gfx_BindTexture(Gui.ClassicTexture ? Gui.GuiClassicTex : Gui.GuiTex); Gfx_BindTexture(Gui.ClassicTexture ? Gui.GuiClassicTex : Gui.GuiTex);
/* TODO: Does this 400 need to take DPI into account */ /* TODO: Does this 400 need to take DPI into account */
Gfx_DrawVb_IndexedTris_Range(w->width >= 400 ? 4 : 8, offset); Gfx_DrawVb_IndexedTris_Range(w->width >= 400 ? 4 : 8, offset, DRAW_HINT_NONE);
if (w->tex.ID) { if (w->tex.ID) {
Gfx_BindTexture(w->tex.ID); Gfx_BindTexture(w->tex.ID);
Gfx_DrawVb_IndexedTris_Range(4, offset + 8); Gfx_DrawVb_IndexedTris_Range(4, offset + 8, DRAW_HINT_NONE);
} }
return offset + 12; return offset + 12;
} }
@ -452,7 +452,7 @@ static void HotbarWidget_RenderOutline(struct HotbarWidget* w, int offset) {
tex = Gui.ClassicTexture ? Gui.GuiClassicTex : Gui.GuiTex; tex = Gui.ClassicTexture ? Gui.GuiClassicTex : Gui.GuiTex;
Gfx_BindTexture(tex); Gfx_BindTexture(tex);
Gfx_DrawVb_IndexedTris_Range(8, offset); Gfx_DrawVb_IndexedTris_Range(8, offset, DRAW_HINT_NONE);
} }
static void HotbarWidget_RenderEntries(struct HotbarWidget* w, int offset) { static void HotbarWidget_RenderEntries(struct HotbarWidget* w, int offset) {
@ -1597,12 +1597,12 @@ static void TextInputWidget_BuildMesh(void* widget, struct VertexTextured** vert
static int TextInputWidget_Render2(void* widget, int offset) { static int TextInputWidget_Render2(void* widget, int offset) {
struct InputWidget* w = (struct InputWidget*)widget; struct InputWidget* w = (struct InputWidget*)widget;
Gfx_BindTexture(w->inputTex.ID); Gfx_BindTexture(w->inputTex.ID);
Gfx_DrawVb_IndexedTris_Range(4, offset); Gfx_DrawVb_IndexedTris_Range(4, offset, DRAW_HINT_SPRITE);
offset += 4; offset += 4;
if (w->showCaret && Math_Mod1((float)w->caretAccumulator) < 0.5f) { if (w->showCaret && Math_Mod1((float)w->caretAccumulator) < 0.5f) {
Gfx_BindTexture(w->caretTex.ID); Gfx_BindTexture(w->caretTex.ID);
Gfx_DrawVb_IndexedTris_Range(4, offset); Gfx_DrawVb_IndexedTris_Range(4, offset, DRAW_HINT_SPRITE);
} }
return offset + 4; return offset + 4;
} }
@ -2460,7 +2460,7 @@ static int TextGroupWidget_Render2(void* widget, int offset) {
if (!textures[i].ID) continue; if (!textures[i].ID) continue;
Gfx_BindTexture(textures[i].ID); Gfx_BindTexture(textures[i].ID);
Gfx_DrawVb_IndexedTris_Range(4, offset); Gfx_DrawVb_IndexedTris_Range(4, offset, DRAW_HINT_SPRITE);
} }
return offset; return offset;
} }
@ -2817,7 +2817,7 @@ static int ThumbstickWidget_Render2(void* widget, int offset) {
Gfx_BindTexture(Gui.TouchTex); Gfx_BindTexture(Gui.TouchTex);
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
base = (flags & (1 << i)) ? 0 : THUMBSTICKWIDGET_PER; base = (flags & (1 << i)) ? 0 : THUMBSTICKWIDGET_PER;
Gfx_DrawVb_IndexedTris_Range(4, offset + base + (i * 4)); Gfx_DrawVb_IndexedTris_Range(4, offset + base + (i * 4), DRAW_HINT_NONE);
} }
} }
return offset + THUMBSTICKWIDGET_MAX; return offset + THUMBSTICKWIDGET_MAX;