MCPcopy Create free account
hub / github.com/OneLoneCoder/olcPixelGameEngine / FillTexturedTriangle

Method FillTexturedTriangle

olcPixelGameEngine.h:3192–3304  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 3

PixelLerpFunction · 0.85
SampleMethod · 0.45
lerpMethod · 0.45

Tested by

no test coverage detected