I'm developing a simple polygon class (using allegro) to use in games in a way similar to level 10 graphics on the snes. Like with one ground polygon and sprites rendered over that all interacting in a 2d way.

I made this class and it works ok, but it renders these weird artifact things at the edge of the polygon. I thought it was just an off by one error in the rendering code, but I tried that and it didn't work. The class uses two functions to render, a main render function and a conversion function that handles rotation, translation, and screen coords.

I'm totally stumped. All that code looks good to me, but something's not working just a little tiny bit. I'll attach a pic of the problem in case that might identify this as some standard problem.Code:void poly_t::render(BITMAP* buffer) { float x, y; int bmpx, bmpy, screenx, screeny; point_t point; //step through poly and save converted screen coords to buffers for (x = -w/2; x < w/2; x += w / float(bmp->w)) { for (y = -h/2; y < h/2; y += h / float(bmp->h)) { //gen interpolated 3d point (object origin) point.set(x,y,0); //convert 3d point to world origin to screen conv(point,screenx,screeny); //find location in bitmap bmpx = int((x + w/2) / w * float(bmp->w)); bmpy = int((y + h/2) / h * float(bmp->h)); if (bmpx < 0 || bmpx >= max || bmpy < 0 || bmpy >= max) error("Invalid bmp coords (" + tostring(bmpx) + "," + tostring(bmpy) + ")"); //save data to buffers screenbufferx[bmpx][bmpy] = screenx; screenbuffery[bmpx][bmpy] = screeny; screenbufferc[bmpx][bmpy] = getpixel(bmp,bmpx,bmpy); } } //use buffers to render poly with triangles for (bmpx = 1; bmpx < bmp->w - 2; ++bmpx) { for (bmpy = 1; bmpy < bmp->h - 2; ++bmpy) { triangle(buffer,screenbufferx[bmpx][bmpy],screenbuffery[bmpx][bmpy], screenbufferx[bmpx+1][bmpy],screenbuffery[bmpx+1][bmpy], screenbufferx[bmpx][bmpy+1],screenbuffery[bmpx][bmpy+1], screenbufferc[bmpx][bmpy]); triangle(buffer,screenbufferx[bmpx+1][bmpy+1],screenbuffery[bmpx+1][bmpy+1], screenbufferx[bmpx+1][bmpy],screenbuffery[bmpx+1][bmpy], screenbufferx[bmpx][bmpy+1],screenbuffery[bmpx][bmpy+1], screenbufferc[bmpx][bmpy]); } } } //object origin points in void poly_t::conv(point_t& point, int& screenx, int& screeny) { point_t x, y, z; //rotate about x-axis x.x = point.x; x.y = cos(th.x) * point.y - sin(th.x) * point.z; x.z = sin(th.x) * point.y + cos(th.x) * point.z; //rotate about y-axis y.x = cos(th.y) * x.x + sin(th.y) * x.z; y.y = x.y; y.z = sin(th.y) * x.x + cos(th.y) * x.z; //rotate about z-axis z.x = cos(th.z) * y.x - sin(th.z) * y.y; z.y = sin(th.z) * y.x + cos(th.z) * y.y; z.z = y.z; //translate z.x += pos.x; z.y += pos.y; z.z += pos.z; //to screen screenx = SCREEN_W/2 + int((z.x / z.z) * float(SCREEN_W/2)); screeny = SCREEN_H/2 + int((z.y / z.z) * float(SCREEN_W/2)); }