All pastes #2087761 Raw Edit

Something

public text v1 · immutable
#2087761 ·published 2011-10-07 19:30 UTC
rendered paste body
// Work out min and max X and Y
int minX = min((int)x1, (int)x2, (int)x3);
int maxX = max((int)x1, (int)x2, (int)x3);
int minY = min((int)y1, (int)y2, (int)y3);
int maxY = max((int)y1, (int)y2, (int)y3);

// Make sure they're not outside of the screen
if (minX < 0)
	minX = 0;
if (minY < 0)
	minY = 0;
if (maxX >= _width)
	maxX = _width - 1;
if (maxY >= _height)
	maxY = _height - 1;

// Precalculate half-space function coefficients
int dx1 = (int)(x1 - x2);
int dx2 = (int)(x2 - x3);
int dx3 = (int)(x3 - x1);

int dy1 = (int)(y1 - y2);
int dy2 = (int)(y2 - y3);
int dy3 = (int)(y3 - y1);
			
int check1 = (int)((dx1 * minY) - (dx1 * y1) - (dy1 * minX) + (dy1 * x1));
int check2 = (int)((dx2 * minY) - (dx2 * y2) - (dy2 * minX) + (dy2 * x2));
int check3 = (int)((dx3 * minY) - (dx3 * y3) - (dy3 * minX) + (dy3 * x3));

unsigned int* buffer = (unsigned int*)_pixelBuffer;

buffer += minY * _width;

for (int y = minY; y < maxY; y++)
{
	// Create temporary copies of the checks because they'll be needed when loop ends
	int check1Temp = check1;
	int check2Temp = check2;
	int check3Temp = check3;

	for (int x = minX; x < maxX; x++)
	{
		if(check1Temp > 0 &&
			check2Temp > 0 &&
			check3Temp > 0)
		{
			buffer[x] = 0;
		}

		check1Temp -= dy1;
		check2Temp -= dy2;
		check3Temp -= dy3;
	}

	buffer += _width;

	check1 += dx1;
	check2 += dx2;
	check3 += dx3;
}