public static bool ProjectAlongPlane(idVec3 t, idVec3 normal, float epsilon, float overBounce)
        {
            idVec3 cross = t.Cross(normal).Cross(t);

            // normalize so a fixed epsilon can be used
            cross.Normalize();
            float len = normal * cross;

            if (idMath.Fabs(len) < epsilon)
            {
                return(false);
            }
            cross.opMul(overBounce * (normal * t) / len);
            t.opSub(cross);
            return(true);
        }
        public void NormalVectors(ref idVec3 left, ref idVec3 down)
        {
            float d = x * x + y * y;

            if (d == 0)
            {
                left.x = 1;
                left.y = 0;
                left.z = 0;
            }
            else
            {
                d      = idMath.InvSqrt(d);
                left.x = -y * d;
                left.y = x * d;
                left.z = 0;
            }
            down = left.Cross(this);
        }
 public static bool ProjectAlongPlane(idVec3 t, idVec3 normal, float epsilon, float overBounce)
 {
     idVec3 cross = t.Cross(normal).Cross(t);
     // normalize so a fixed epsilon can be used
     cross.Normalize();
     float len = normal * cross;
     if (idMath.Fabs(len) < epsilon)
         return false;
     cross.opMul(overBounce * (normal * t) / len);
     t.opSub(cross);
     return true;
 }
 public void NormalVectors(ref idVec3 left, ref idVec3 down)
 {
     float d = x * x + y * y;
     if (d == 0)
     {
         left.x = 1;
         left.y = 0;
         left.z = 0;
     }
     else
     {
         d = idMath.InvSqrt(d);
         left.x = -y * d;
         left.y = x * d;
         left.z = 0;
     }
     down = left.Cross(this);
 }