bool CPolygon::Intersect(CRay &ray, bool cull, float *dist)
{
   if(!ray.Intersect(m_vertexList[0], m_vertexList[1],
      m_vertexList[2], false, dist)) return false;
   
   if(!cull)
      {
         if(!ray.Intersect(m_vertexList[2], m_vertexList[1],
            m_vertexList[0], false, dist)) return false;
      }
   
   return true;
}
void CPolygon::Clip(CPlane &pl, CPolygon *front, CPolygon *back)
{
   CVector3 frontVecs[3], backVecs[3];
   int frontIndex = 0;
   int backIndex = 0;

   if(!front && !back) return;

   switch(pl.ClassifyPoint(m_vertexList[0]))
      {
         case UGP_FRONT:
            frontVecs[frontIndex++] = m_vertexList[0];
            break;
         
         case UGP_BACK:
            backVecs[backIndex++] = m_vertexList[0];
            break;
         
         case UGP_ON_PLANE:
            frontVecs[frontIndex++] = m_vertexList[0];
            backVecs[backIndex++] = m_vertexList[0];
            //frontVecs[backIndex++] = m_vertexList[0];
            break;
         
         default:
            return;
      }

   int index = 0;
   int v1Type = 0, v2Type = 0;
   CVector3 v1, v2, intersectPoint;
   CRay ray;

   for(int i = 1; i < 4; i++)
      {
         if(i == 3) index = 0;
         else index = i;

         v1 = m_vertexList[i - 1];
         v2 = m_vertexList[index];

         v1Type = pl.ClassifyPoint(v1);
         v2Type = pl.ClassifyPoint(v2);

         if(v2Type == UGP_ON_PLANE)
            {
               frontVecs[frontIndex++] = m_vertexList[index];
               backVecs[backIndex++] = m_vertexList[index];
            }
         else
            {
               float length = 0;
               ray.m_origin = v1;
               ray.m_direction = v2 - v1;
               length = ray.m_direction.GetLength();
               ray.m_direction.Normal();
               
               if(ray.Intersect(pl, false, length, &intersectPoint, 0) &&
                  (v1Type != UGP_ON_PLANE))
                  {
                     frontVecs[frontIndex++] = intersectPoint;
                     backVecs[backIndex++] = intersectPoint;
                  }
               
               if(index == 0) continue;
               if(v2Type == UGP_FRONT) frontVecs[frontIndex++] = m_vertexList[index];
               else if(v2Type == UGP_BACK) backVecs[backIndex++] = m_vertexList[index];
            }
      }
   
   if(front)
      {
         CPlane fPl;
         CVector3 n, n2;

         // Be sure to keep same orientation.
         fPl.CreatePlaneFromTri(frontVecs[0], frontVecs[1], frontVecs[2]);
         n.x = fPl.a; n.y = fPl.b; n.z = fPl.c;
         n2.x = pl.a; n2.y = pl.b; n2.z = pl.c;

         if(n.DotProduct3(n2) >= 0.0f)
            {
               front->m_vertexList[0] = frontVecs[0];
               front->m_vertexList[1] = frontVecs[1];
               front->m_vertexList[2] = frontVecs[2];
            }
         else
            {
               front->m_vertexList[0] = frontVecs[2];
               front->m_vertexList[1] = frontVecs[1];
               front->m_vertexList[2] = frontVecs[0];
            }
      }
   
   if(back)
      {
         CPlane fPl;
         CVector3 n, n2;

         // Be sure to keep same orientation.
         fPl.CreatePlaneFromTri(backVecs[0], backVecs[1], backVecs[2]);
         n.x = fPl.a; n.y = fPl.b; n.z = fPl.c;
         n2.x = pl.a; n2.y = pl.b; n2.z = pl.c;

         if(n.DotProduct3(n2) >= 0.0f)
            {
               back->m_vertexList[0] = backVecs[0];
               back->m_vertexList[1] = backVecs[1];
               back->m_vertexList[2] = backVecs[2];
            }
         else
            {
               back->m_vertexList[0] = backVecs[2];
               back->m_vertexList[1] = backVecs[1];
               back->m_vertexList[2] = backVecs[0];
            }
      }
}