Thread: my polygon class

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    GA ichijoji's Avatar
    Join Date
    Nov 2002
    Posts
    179

    my polygon class

    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.
    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));
    }
    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.
    Last edited by ichijoji; 08-02-2004 at 01:10 AM.
    Illusion and reality become impartiality and confidence.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Screwy Linker Error - VC2005
    By Tonto in forum C++ Programming
    Replies: 5
    Last Post: 06-19-2007, 02:39 PM
  2. Creating a database
    By Shamino in forum Game Programming
    Replies: 19
    Last Post: 06-10-2007, 01:09 PM
  3. Mmk, I give up, lets try your way. (Resource Management)
    By Shamino in forum Game Programming
    Replies: 31
    Last Post: 01-18-2006, 09:54 AM
  4. class errors
    By romeoz in forum C++ Programming
    Replies: 3
    Last Post: 09-16-2003, 07:57 PM