public bool FindTriangleCollisionClipMethod(PrimitiveTriangle other, GIM_TRIANGLE_CONTACT contacts)
        {
            float margin = m_margin + other.m_margin;


            int clipped_count;

            //create planes
            // plane v vs U points


            m_contacts1.m_separating_normal = m_plane;

            clipped_count = ClipTriangle(other, clipped_points);

            if (clipped_count == 0)
            {
                return(false);//Reject
            }

            //find most deep interval face1
            m_contacts1.MergePoints(ref m_contacts1.m_separating_normal, margin, clipped_points, clipped_count);
            if (m_contacts1.m_point_count == 0)
            {
                return(false); // too far
            }
            //Normal pointing to this triangle
            m_contacts1.m_separating_normal *= -1.0f;


            //Clip tri1 by tri2 edges
            GIM_TRIANGLE_CONTACT contacts2 = new GIM_TRIANGLE_CONTACT();

            contacts2.m_separating_normal = other.m_plane;

            clipped_count = other.ClipTriangle(this, clipped_points);

            if (clipped_count == 0)
            {
                return(false);//Reject
            }

            //find most deep interval face1
            contacts2.MergePoints(ref contacts2.m_separating_normal, margin, clipped_points, clipped_count);
            if (contacts2.m_point_count == 0)
            {
                return(false); // too far
            }

            ////check most dir for contacts
            if (contacts2.m_penetration_depth < m_contacts1.m_penetration_depth)
            {
                contacts.CopyFrom(contacts2);
            }
            else
            {
                contacts.CopyFrom(m_contacts1);
            }
            return(true);
        }
 public void CopyFrom(GIM_TRIANGLE_CONTACT other)
 {
     m_penetration_depth = other.m_penetration_depth;
     m_separating_normal = other.m_separating_normal;
     m_point_count = other.m_point_count;
     int i = m_point_count;
     while (i-- != 0)
     {
         m_points[i] = other.m_points[i];
     }
 }
 public void PushTriangleContacts(GIM_TRIANGLE_CONTACT tricontact,
                                  int feature1, int feature2)
 {
     for (int i = 0; i < tricontact.m_point_count; i++)
     {
         PushContact(
             ref tricontact.m_points[i],
             ref tricontact.m_separating_normal,
             tricontact.m_penetration_depth, feature1, feature2);
     }
 }
        public void CopyFrom(GIM_TRIANGLE_CONTACT other)
        {
            m_penetration_depth = other.m_penetration_depth;
            m_separating_normal = other.m_separating_normal;
            m_point_count       = other.m_point_count;
            int i = m_point_count;

            while (i-- != 0)
            {
                m_points[i] = other.m_points[i];
            }
        }
 public GIM_TRIANGLE_CONTACT(GIM_TRIANGLE_CONTACT other)
 {
     CopyFrom(other);
 }
        public bool FindTriangleCollisionClipMethod(PrimitiveTriangle other, GIM_TRIANGLE_CONTACT contacts)
        {
            float margin = m_margin + other.m_margin;


            int clipped_count;
            //create planes
            // plane v vs U points


            m_contacts1.m_separating_normal = m_plane;

            clipped_count = ClipTriangle(other, clipped_points);

            if (clipped_count == 0)
            {
                return false;//Reject
            }

            //find most deep interval face1
            m_contacts1.MergePoints(ref m_contacts1.m_separating_normal, margin, clipped_points, clipped_count);
            if (m_contacts1.m_point_count == 0)
            {
                return false; // too far
            }
            //Normal pointing to this triangle
            m_contacts1.m_separating_normal *= -1.0f;


            //Clip tri1 by tri2 edges
            GIM_TRIANGLE_CONTACT contacts2 = new GIM_TRIANGLE_CONTACT();
            contacts2.m_separating_normal = other.m_plane;

            clipped_count = other.ClipTriangle(this, clipped_points);

            if (clipped_count == 0)
            {
                return false;//Reject
            }

            //find most deep interval face1
            contacts2.MergePoints(ref contacts2.m_separating_normal, margin, clipped_points, clipped_count);
            if (contacts2.m_point_count == 0)
            {
                return false; // too far
            }

            ////check most dir for contacts
            if (contacts2.m_penetration_depth < m_contacts1.m_penetration_depth)
            {
                contacts.CopyFrom(contacts2);
            }
            else
            {
                contacts.CopyFrom(m_contacts1);
            }
            return true;

        }
 public GIM_TRIANGLE_CONTACT(GIM_TRIANGLE_CONTACT other)
 {
     CopyFrom(other);
 }