diff --git a/main.c b/main.c index 6865fc2..cd0353e 100644 --- a/main.c +++ b/main.c @@ -293,9 +293,18 @@ static int fakeLight(const int *norm) void drawModel(ps1mdl_t *model, TIM_IMAGE *frontTex, TIM_IMAGE *backTex, int xOffset, int frameCounter) { + TIM_IMAGE *tex; + short u0, u1, u2, uoffs, voffs; + int frameNum = frameCounter % model->header->frameCount; int vertOffs = frameNum * model->header->vertexCount; + unsigned short halfSkinWidth = model->header->skinWidth >> 1; + short frontUOffs = (frontTex->prect->x % 64) << (2 - (frontTex->mode & 0x3)); + short frontVOffs = (frontTex->prect->y & 0xFF); + short backUOffs = (backTex->prect->x % 64) << (2 - (backTex->mode & 0x3)); + short backVOffs = (backTex->prect->y & 0xFF); + for (int triIdx = 0; triIdx < model->header->triangleCount; ++triIdx) { ps1mdl_triangle_t *tri = &model->triangles[triIdx]; @@ -318,15 +327,19 @@ void drawModel(ps1mdl_t *model, TIM_IMAGE *frontTex, TIM_IMAGE *backTex, int xOf int lit1 = fakeLight(anorms[v1->normalIndex]); int lit2 = fakeLight(anorms[v2->normalIndex]); - // Since we have the texture split into two parts, we need to correct the UVs that are *not* on the seam, instead of the other way round - short u0 = !tri->frontFace && !tc0->onSeam ? tc0->u - (model->header->skinWidth >> 1) : tc0->u; - short u1 = !tri->frontFace && !tc1->onSeam ? tc1->u - (model->header->skinWidth >> 1) : tc1->u; - short u2 = !tri->frontFace && !tc2->onSeam ? tc2->u - (model->header->skinWidth >> 1) : tc2->u; - - TIM_IMAGE *tex = tri->frontFace ? frontTex : backTex; - - short uoffs = (tex->prect->x % 64) << (2 - (tex->mode & 0x3)); - short voffs = (tex->prect->y & 0xFF); + if (tri->frontFace) + { + u0 = tc0->u, u1 = tc1->u, u2 = tc2->u; + tex = frontTex, uoffs = frontUOffs, voffs = frontVOffs; + } + else + { + // Since we have the texture split into two parts, we need to correct the UVs that are *not* on the seam, instead of the other way round + u0 = tc0->onSeam ? tc0->u : tc0->u - halfSkinWidth; + u1 = tc1->onSeam ? tc1->u : tc1->u - halfSkinWidth; + u2 = tc2->onSeam ? tc2->u : tc2->u - halfSkinWidth; + tex = backTex, uoffs = backUOffs, voffs = backVOffs; + } POLY_GT3 *poly = (POLY_GT3*)nextpri; setPolyGT3(poly);