public BVHNode(Hitable[] p, int n, float time0, float time1) { int Compare(Hitable a, Hitable b, int i) { AABB l = new AABB(), r = new AABB(); if (!a.BoundingBox(0, 0, ref l) || !b.BoundingBox(0, 0, ref r)) { throw new Exception("NULL"); } return(l.min[i] - r.min[i] < 0 ? -1 : 1); } Hitable[] Split_array(Hitable[] Source, int StartIndex, int EndIndex) { var result = new Hitable[EndIndex - StartIndex + 1]; for (var i = 0; i <= EndIndex - StartIndex; i++) { result[i] = Source[i + StartIndex]; } return(result); } var pl = p.ToList(); var method = (int)(3 * MyLabrary.Random.Get()); pl.Sort((a, b) => Compare(a, b, method)); p = pl.ToArray(); switch (n) { case 1: left = right = p[0]; break; case 2: left = p[0]; right = p[1]; break; default: left = new BVHNode(Split_array(p, 0, n / 2 - 1), n / 2, time0, time1); right = new BVHNode(Split_array(p, n / 2, n - 1), n - n / 2, time0, time1); break; } AABB box_left = new AABB(), box_right = new AABB(); if (!left.BoundingBox(time0, time1, ref box_left) || !right.BoundingBox(time0, time1, ref box_right)) { throw new Exception("no bounding box in bvh_node constructor"); } box = GetBox(box_left, box_right); }
public FilpNormals(Hitable p) => hitable = p;