all repos — mgba @ 838d13f2efb8b97aa7e09f93441b5f5090326b8f

mGBA Game Boy Advance Emulator

GBA Video: Improve GL sprite mosaic
Vicki Pfau vi@endrift.com
Mon, 20 May 2019 18:19:55 -0700
commit

838d13f2efb8b97aa7e09f93441b5f5090326b8f

parent

1868ccaadd9e50ad929a72666956f6b01e2e219c

1 files changed, 10 insertions(+), 3 deletions(-)

jump to
M src/gba/renderers/gl.csrc/gba/renderers/gl.c

@@ -404,10 +404,13 @@

"void main() {\n" " vec2 incoord = texCoord;\n" " if (mosaic.x > 1) {\n" - " incoord.x -= mod(mosaic.z + incoord.x, mosaic.x);\n" + " incoord.x = int(clamp(incoord.x - mod(mosaic.z + incoord.x, mosaic.x), 0, dims.z - 1));\n" + " } else if (mosaic.x < -1) {\n" + " incoord.x = dims.z - incoord.x - 1;" + " incoord.x = clamp(dims.z - int(incoord.x - mod(mosaic.z + incoord.x, -mosaic.x)) - 1, 0, dims.z - 1);\n" " }\n" " if (mosaic.y > 1) {\n" - " incoord.y -= mod(mosaic.w + incoord.y, mosaic.y);\n" + " incoord.y = int(clamp(incoord.y - mod(mosaic.w + incoord.y, mosaic.y), 0, dims.w - 1));\n" " }\n" " ivec2 coord = ivec2(transform * (incoord - dims.zw / 2) + dims.xy / 2);\n" " if ((coord & ~(dims.xy - 1)) != ivec2(0, 0)) {\n"

@@ -1340,7 +1343,11 @@ glUniform4f(uniforms[GBA_GL_OBJ_OBJWIN], 0, 0, 0, 0);

glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }); } if (GBAObjAttributesAIsMosaic(sprite->a)) { - glUniform4i(uniforms[GBA_GL_OBJ_MOSAIC], GBAMosaicControlGetObjV(renderer->mosaic) + 1, GBAMosaicControlGetObjH(renderer->mosaic) + 1, x, spriteY); + int mosaicH = GBAMosaicControlGetObjH(renderer->mosaic) + 1; + if (GBAObjAttributesBIsHFlip(sprite->b)) { + mosaicH = -mosaicH; + } + glUniform4i(uniforms[GBA_GL_OBJ_MOSAIC], mosaicH, GBAMosaicControlGetObjV(renderer->mosaic) + 1, x, spriteY); } else { glUniform4i(uniforms[GBA_GL_OBJ_MOSAIC], 0, 0, 0, 0); }