コード例 #1
0
ファイル: figure.cs プロジェクト: eqk/RayTrace
        public virtual bool RayIntersection(Ray r, out float t, out Point3D normal)
        {
            t      = 0;
            normal = null;
            Side best_side = null;

            foreach (Side s in sides)
            {
                switch (s.points.Count)
                {
                case 3:
                    if (r.IntersectTriangle(s.get_point(0),
                                            s.get_point(1),
                                            s.get_point(2),
                                            out float t1) &&
                        (t == 0 || t1 < t))
                    {
                        t         = t1;
                        best_side = s;
                    }
                    break;

                case 4:
                    if (r.IntersectTriangle(s.get_point(0),
                                            s.get_point(1),
                                            s.get_point(3),
                                            out float t2) &&
                        (t == 0 || t2 < t))
                    {
                        t         = t2;
                        best_side = s;
                    }
                    else if (r.IntersectTriangle(s.get_point(3),
                                                 s.get_point(1),
                                                 s.get_point(2),
                                                 out t2) &&
                             (t == 0 || t2 < t))
                    {
                        t         = t2;
                        best_side = s;
                    }
                    break;

                default:
                    break;
                }
            }


            if (best_side != null)
            {
                normal = Side.norm(best_side);
                mat.SetColor(best_side.drawing_pen.Color);
                return(true);
            }

            return(false);
        }