| 3190 | } |
| 3191 | |
| 3192 | void PixelGameEngine::FillTexturedTriangle(std::vector<olc::vf2d> vPoints, std::vector<olc::vf2d> vTex, std::vector<olc::Pixel> vColour, olc::Sprite* sprTex) |
| 3193 | { |
| 3194 | olc::vi2d p1 = vPoints[0]; |
| 3195 | olc::vi2d p2 = vPoints[1]; |
| 3196 | olc::vi2d p3 = vPoints[2]; |
| 3197 | |
| 3198 | if (p2.y < p1.y) { std::swap(p1.y, p2.y); std::swap(p1.x, p2.x); std::swap(vTex[0].x, vTex[1].x); std::swap(vTex[0].y, vTex[1].y); std::swap(vColour[0], vColour[1]); } |
| 3199 | if (p3.y < p1.y) { std::swap(p1.y, p3.y); std::swap(p1.x, p3.x); std::swap(vTex[0].x, vTex[2].x); std::swap(vTex[0].y, vTex[2].y); std::swap(vColour[0], vColour[2]); } |
| 3200 | if (p3.y < p2.y) { std::swap(p2.y, p3.y); std::swap(p2.x, p3.x); std::swap(vTex[1].x, vTex[2].x); std::swap(vTex[1].y, vTex[2].y); std::swap(vColour[1], vColour[2]); } |
| 3201 | |
| 3202 | olc::vi2d dPos1 = p2 - p1; |
| 3203 | olc::vf2d dTex1 = vTex[1] - vTex[0]; |
| 3204 | int dcr1 = vColour[1].r - vColour[0].r; |
| 3205 | int dcg1 = vColour[1].g - vColour[0].g; |
| 3206 | int dcb1 = vColour[1].b - vColour[0].b; |
| 3207 | int dca1 = vColour[1].a - vColour[0].a; |
| 3208 | |
| 3209 | olc::vi2d dPos2 = p3 - p1; |
| 3210 | olc::vf2d dTex2 = vTex[2] - vTex[0]; |
| 3211 | int dcr2 = vColour[2].r - vColour[0].r; |
| 3212 | int dcg2 = vColour[2].g - vColour[0].g; |
| 3213 | int dcb2 = vColour[2].b - vColour[0].b; |
| 3214 | int dca2 = vColour[2].a - vColour[0].a; |
| 3215 | |
| 3216 | float dax_step = 0, dbx_step = 0, dcr1_step = 0, dcr2_step = 0, dcg1_step = 0, dcg2_step = 0, dcb1_step = 0, dcb2_step = 0, dca1_step = 0, dca2_step = 0; |
| 3217 | olc::vf2d vTex1Step, vTex2Step; |
| 3218 | |
| 3219 | if (dPos1.y) |
| 3220 | { |
| 3221 | dax_step = dPos1.x / (float)abs(dPos1.y); |
| 3222 | vTex1Step = dTex1 / (float)abs(dPos1.y); |
| 3223 | dcr1_step = dcr1 / (float)abs(dPos1.y); |
| 3224 | dcg1_step = dcg1 / (float)abs(dPos1.y); |
| 3225 | dcb1_step = dcb1 / (float)abs(dPos1.y); |
| 3226 | dca1_step = dca1 / (float)abs(dPos1.y); |
| 3227 | } |
| 3228 | |
| 3229 | if (dPos2.y) |
| 3230 | { |
| 3231 | dbx_step = dPos2.x / (float)abs(dPos2.y); |
| 3232 | vTex2Step = dTex2 / (float)abs(dPos2.y); |
| 3233 | dcr2_step = dcr2 / (float)abs(dPos2.y); |
| 3234 | dcg2_step = dcg2 / (float)abs(dPos2.y); |
| 3235 | dcb2_step = dcb2 / (float)abs(dPos2.y); |
| 3236 | dca2_step = dca2 / (float)abs(dPos2.y); |
| 3237 | } |
| 3238 | |
| 3239 | olc::vi2d vStart; |
| 3240 | olc::vi2d vEnd; |
| 3241 | int vStartIdx; |
| 3242 | |
| 3243 | for (int pass = 0; pass < 2; pass++) |
| 3244 | { |
| 3245 | if (pass == 0) |
| 3246 | { |
| 3247 | vStart = p1; vEnd = p2; vStartIdx = 0; |
| 3248 | } |
| 3249 | else |