GBA Video: Improve GL sprite mosaic

This commit is contained in:
Vicki Pfau 2019-05-20 18:19:55 -07:00
parent 1868ccaadd
commit 838d13f2ef
1 changed files with 10 additions and 3 deletions

View File

@ -404,10 +404,13 @@ static const char* const _renderObj =
"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 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB
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);
}