public class TriPoly extends Triangle {
  Point3D normal;
  boolean vis;
  float l;
  int surf;

  // hmm, just use indices here? fuck yeah!
  int v2[];

  TriPoly(int v0, int v1, int v2b, int s) {
    v2 = new int[3];
    v2[0] = v0;
    v2[1] = v1;
    v2[2] = v2b;
    vis = true;
    surf = s;
  }

  void Draw(Raster r2, Vertex3D[] vlist, Surface[] slist, Light amb, java.util.Vector ls) {
    v[0] = vlist[v2[0]];
    v[1] = vlist[v2[1]];
    v[2] = vlist[v2[2]];
    innerDraw(r2, slist, amb, ls);
  }

  void Draw(Raster r2, java.util.Vector vlist, Surface[] slist, Light amb, java.util.Vector ls) {
    v[0] = (Vertex3D)vlist.elementAt(v2[0]);
    v[1] = (Vertex3D)vlist.elementAt(v2[1]);
    v[2] = (Vertex3D)vlist.elementAt(v2[2]);
    innerDraw(r2, slist, amb, ls);
  }

  void innerDraw(Raster r2, Surface[] slist, Light amb, java.util.Vector ls) {
    float r, g, b, ka, kd;
    ka = slist[surf].ka;
    kd = slist[surf].kd;
    r = g = b = 0;
    // diffuse
    for(int i=0; i<ls.size(); i++) {
      if(((Light)ls.elementAt(i)).lightType == Light.DIRECTIONAL) {
	Vertex3D light = new Vertex3D(((Light)ls.elementAt(i)).x,// - wList[pList[i].v2[1]].x,
				      ((Light)ls.elementAt(i)).y,// - wList[pList[i].v2[1]].y,
				      ((Light)ls.elementAt(i)).z,// - wList[pList[i].v2[1]].z,
				      0);
	l = light.dot(normal);// / 10f;
	r += slist[surf].r * l * kd * ((Light)ls.elementAt(i)).ir;
	g += slist[surf].g * l * kd * ((Light)ls.elementAt(i)).ig;
	b += slist[surf].b * l * kd * ((Light)ls.elementAt(i)).ib;
      }
    }
    // ambient 
    r += slist[surf].r * ka * ((Light)amb).ir;
    g += slist[surf].g * ka * ((Light)amb).ig;
    b += slist[surf].b * ka * ((Light)amb).ib;
    // cleanup
    r *= 255.0f;
    g *= 255.0f;
    b *= 255.0f;
    if(r>255) r=255;
    if(g>255) g=255;
    if(b>255) b=255;
    if(r<0) { r=0; System.out.println("Bad light?"); }
    if(g<0) { g=0; System.out.println("Bad light?"); }
    if(b<0) { b=0; System.out.println("Bad light?"); }
    v[0].argb = (255 << 24) + ((int)r << 16) + ((int)g << 8) + (int)b;
    v[1].argb = (255 << 24) + ((int)r << 16) + ((int)g << 8) + (int)b;
    v[2].argb = (255 << 24) + ((int)r << 16) + ((int)g << 8) + (int)b;
    super.Draw(r2);
  }
}
