public static Boundary SurroundingBoundary(Boundary a, Boundary b) { var boundary = new Boundary(); boundary.box = Aabb.SurroundingBox(a.box, b.box); return(boundary); }
public MovingSphere(Vector3 center0, Vector3 center1, float t0, float t1, float r, MaterialData material) : base(center0, r, material) { center1_ = center1; time0_ = t0; time1_ = t1; boundary_.box = Aabb.SurroundingBox(boundary_.box, CreateAabb(center1_, radius_)); }
public bool BoundingBox(double t0, double t1, out Aabb outputBox) { var firstBox = true; outputBox = default(Aabb); foreach (var obj in Objects) { if (!obj.BoundingBox(t0, t1, out var output)) { return(false); } outputBox = firstBox ? output : Aabb.SurroundingBox(outputBox, output); firstBox = false; } return(true); }
public bool BoundingBox(double t0, double t1, out Aabb outputBox) { var c0 = CenterForTime(t0); var c1 = CenterForTime(t1); var b0 = new Aabb { Min = c0 - new Vec3(Radius, Radius, Radius), Max = c0 + new Vec3(Radius, Radius, Radius), }; var b1 = new Aabb { Min = c1 - new Vec3(Radius, Radius, Radius), Max = c1 + new Vec3(Radius, Radius, Radius), }; outputBox = Aabb.SurroundingBox(b0, b1); return(true); }
public BvhNode(List <IHittable> srcObjects, int start, int end, double t0, double t1) { var min = new Vec3(MathUtils.Infinity, MathUtils.Infinity, MathUtils.Infinity); var max = new Vec3(-MathUtils.Infinity, -MathUtils.Infinity, -MathUtils.Infinity); for (var i = start; i < end; i++) { srcObjects[i].BoundingBox(t0, t1, out var box); if (box.Min.x < min.x) { min.x = box.Min.x; } if (box.Min.y < min.y) { min.y = box.Min.y; } if (box.Min.z < min.z) { min.z = box.Min.z; } if (box.Max.x > max.x) { max.x = box.Max.x; } if (box.Max.y > max.y) { max.y = box.Max.y; } if (box.Max.z > max.z) { max.z = box.Max.z; } } var diffs = max - min; var axis = 0; if (diffs.y > diffs.x && diffs.y > diffs.z) { axis = 1; } if (diffs.z > diffs.x && diffs.z > diffs.y) { axis = 2; } IComparer <IHittable> comparator; switch (axis) { case 0: comparator = new BoxCompareX(); break; case 1: comparator = new BoxCompareY(); break; default: comparator = new BoxCompareZ(); break; } var objSpan = end - start; if (objSpan == 1) { Left = srcObjects[start]; Right = srcObjects[start]; } else if (objSpan == 2) { if (comparator.Compare(srcObjects[start], srcObjects[start + 1]) < 0) { Left = srcObjects[start]; Right = srcObjects[start + 1]; } else { Left = srcObjects[start + 1]; Right = srcObjects[start]; } } else { srcObjects.Sort(start, objSpan, comparator); var mid = start + objSpan / 2; Left = new BvhNode(srcObjects, start, mid, t0, t1); Right = new BvhNode(srcObjects, mid, end, t0, t1); } if (!Left.BoundingBox(t0, t1, out var boxLeft) || !Right.BoundingBox(t0, t1, out var boxRight)) { throw new Exception("No bounding box in BvhNode constructor"); } Box = Aabb.SurroundingBox(boxLeft, boxRight); }