3DS: Use triangles for rendering rectangles

Co-authored-by: asiekierka <asiekierka@users.noreply.github.com>
This commit is contained in:
Cameron Cawley 2024-05-01 19:38:39 +01:00
parent e407b7b720
commit 39f5327333
1 changed files with 54 additions and 10 deletions

View File

@ -428,14 +428,14 @@ static int
N3DS_QueueFillRects(SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FRect * rects, int count) N3DS_QueueFillRects(SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FRect * rects, int count)
{ {
SDL_Color color = *((SDL_Color*) &(cmd->data.draw.r)); SDL_Color color = *((SDL_Color*) &(cmd->data.draw.r));
VertVCT *verts = (VertVCT *) SDL_AllocateRenderVertices(renderer, count * 2 * sizeof (VertVCT), 4, &cmd->data.draw.first); VertVCT *verts = (VertVCT *) SDL_AllocateRenderVertices(renderer, count * 6 * sizeof (VertVCT), 0, &cmd->data.draw.first);
int i; int i;
if (!verts) { if (!verts) {
return -1; return -1;
} }
cmd->data.draw.count = count * 4; cmd->data.draw.count = count * 6;
for (i = 0; i < count; i++, rects++) { for (i = 0; i < count; i++, rects++) {
verts->x = rects->x; verts->x = rects->x;
@ -443,6 +443,16 @@ N3DS_QueueFillRects(SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_F
verts->col = color; verts->col = color;
verts++; verts++;
verts->x = rects->x;
verts->y = rects->y + rects->h;
verts->col = color;
verts++;
verts->x = rects->x + rects->w;
verts->y = rects->y;
verts->col = color;
verts++;
verts->x = rects->x + rects->w; verts->x = rects->x + rects->w;
verts->y = rects->y; verts->y = rects->y;
verts->col = color; verts->col = color;
@ -478,12 +488,12 @@ N3DS_QueueCopy(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * te
const float u1 = srcrect->x + srcrect->w; const float u1 = srcrect->x + srcrect->w;
const float v1 = srcrect->y + srcrect->h; const float v1 = srcrect->y + srcrect->h;
verts = (VertVCT *) SDL_AllocateRenderVertices(renderer, 2 * sizeof (VertVCT), 4, &cmd->data.draw.first); verts = (VertVCT *) SDL_AllocateRenderVertices(renderer, 6 * sizeof (VertVCT), 0, &cmd->data.draw.first);
if (!verts) { if (!verts) {
return -1; return -1;
} }
cmd->data.draw.count = 4; cmd->data.draw.count = 6;
verts->u = u0; verts->u = u0;
verts->v = v0; verts->v = v0;
@ -492,6 +502,20 @@ N3DS_QueueCopy(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * te
verts->col = color; verts->col = color;
verts++; verts++;
verts->u = u0;
verts->v = v1;
verts->x = x;
verts->y = y + height;
verts->col = color;
verts++;
verts->u = u1;
verts->v = v0;
verts->x = x + width;
verts->y = y;
verts->col = color;
verts++;
verts->u = u1; verts->u = u1;
verts->v = v0; verts->v = v0;
verts->x = x + width; verts->x = x + width;
@ -502,7 +526,7 @@ N3DS_QueueCopy(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * te
verts->u = u0; verts->u = u0;
verts->v = v1; verts->v = v1;
verts->x = x; verts->x = x;
verts->y = y + 1; verts->y = y + height;
verts->col = color; verts->col = color;
verts++; verts++;
@ -511,7 +535,6 @@ N3DS_QueueCopy(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * te
verts->x = x + width; verts->x = x + width;
verts->y = y + height; verts->y = y + height;
verts->col = color; verts->col = color;
verts++;
return 0; return 0;
} }
@ -522,7 +545,7 @@ N3DS_QueueCopyEx(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture *
const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, float scale_x, float scale_y) const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, float scale_x, float scale_y)
{ {
SDL_Color color = *((SDL_Color*) &(cmd->data.draw.r)); SDL_Color color = *((SDL_Color*) &(cmd->data.draw.r));
VertVCT *verts = (VertVCT *) SDL_AllocateRenderVertices(renderer, 4 * sizeof (VertVCT), 4, &cmd->data.draw.first); VertVCT *verts = (VertVCT *) SDL_AllocateRenderVertices(renderer, 6 * sizeof (VertVCT), 0, &cmd->data.draw.first);
const float centerx = center->x; const float centerx = center->x;
const float centery = center->y; const float centery = center->y;
const float x = dstrect->x + centerx; const float x = dstrect->x + centerx;
@ -541,7 +564,7 @@ N3DS_QueueCopyEx(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture *
return -1; return -1;
} }
cmd->data.draw.count = 4; cmd->data.draw.count = 6;
s = sinf(degToRad(360-angle)); s = sinf(degToRad(360-angle));
c = cosf(degToRad(360-angle)); c = cosf(degToRad(360-angle));
@ -570,6 +593,20 @@ N3DS_QueueCopyEx(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture *
verts->col = color; verts->col = color;
verts++; verts++;
verts->u = u1;
verts->v = v0;
verts->x = x + cw2 + sh1;
verts->y = y - sw2 + ch1;
verts->col = color;
verts++;
verts->u = u0;
verts->v = v1;
verts->x = x + cw1 + sh2;
verts->y = y - sw1 + ch2;
verts->col = color;
verts++;
verts->u = u0; verts->u = u0;
verts->v = v1; verts->v = v1;
verts->x = x + cw1 + sh2; verts->x = x + cw1 + sh2;
@ -602,6 +639,12 @@ N3DS_QueueCopyEx(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture *
verts--; verts--;
verts->x *= scale_x; verts->x *= scale_x;
verts->y *= scale_y; verts->y *= scale_y;
verts--;
verts->x *= scale_x;
verts->y *= scale_y;
verts--;
verts->x *= scale_x;
verts->y *= scale_y;
} }
return 0; return 0;
@ -724,7 +767,7 @@ N3DS_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vert
.mode = cmd->data.draw.blend .mode = cmd->data.draw.blend
}; };
N3DS_SetBlendState(data, &state); N3DS_SetBlendState(data, &state);
C3D_DrawArrays(GPU_TRIANGLE_STRIP, first, count); C3D_DrawArrays(GPU_TRIANGLES, first, count);
break; break;
} }
@ -737,7 +780,7 @@ N3DS_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vert
.mode = cmd->data.draw.blend .mode = cmd->data.draw.blend
}; };
N3DS_SetBlendState(data, &state); N3DS_SetBlendState(data, &state);
C3D_DrawArrays(GPU_TRIANGLE_STRIP, first, count); C3D_DrawArrays(GPU_TRIANGLES, first, count);
break; break;
} }
@ -914,6 +957,7 @@ N3DS_CreateRenderer(SDL_Renderer * renderer, SDL_Window * window, Uint32 flags)
N3DS_SetRenderTarget(renderer, NULL); N3DS_SetRenderTarget(renderer, NULL);
C3D_DepthTest(false, GPU_GEQUAL, GPU_WRITE_ALL); C3D_DepthTest(false, GPU_GEQUAL, GPU_WRITE_ALL);
C3D_CullFace(GPU_CULL_NONE);
/* Scissoring */ /* Scissoring */
C3D_SetScissor(GPU_SCISSOR_NORMAL, 0, 0, width, height); C3D_SetScissor(GPU_SCISSOR_NORMAL, 0, 0, width, height);