public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec) { if (!box.Hit(ray, t_min, t_max)) { return(false); } HitRecord leftRec = new HitRecord(), rightRec = new HitRecord(); var hit_left = left.Hit(ray, t_min, t_max, ref leftRec); var hit_right = right.Hit(ray, t_min, t_max, ref rightRec); if (hit_left && hit_right) { rec = leftRec.t < rightRec.t ? leftRec : rightRec; return(true); } if (hit_left) { rec = leftRec; return(true); } if (hit_right) { rec = rightRec; return(true); } return(false); }
public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec) { var origin = new Vector3(ray.original); var direction = new Vector3(ray.direction); origin[0] = cos_theta * ray.original[0] - sin_theta * ray.original[2]; origin[2] = sin_theta * ray.original[0] + cos_theta * ray.original[2]; direction[0] = cos_theta * ray.direction[0] - sin_theta * ray.direction[2]; direction[2] = sin_theta * ray.direction[0] + cos_theta * ray.direction[2]; var rotatedR = new Ray(origin, direction, ray.time); var r = new HitRecord(rec); if (Object.Hit(rotatedR, t_min, t_max, ref rec)) { var p = new Vector3(rec.p); var normal = new Vector3(rec.normal); p[0] = cos_theta * rec.p[0] + sin_theta * rec.p[2]; p[2] = -sin_theta * rec.p[0] + cos_theta * rec.p[2]; normal[0] = cos_theta * rec.normal[0] + sin_theta * rec.normal[2]; normal[2] = -sin_theta * rec.normal[0] + cos_theta * rec.normal[2]; rec.p = p; rec.normal = normal; return(true); } rec = r; return(false); }
public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec) { if (!hitable.Hit(ray, t_min, t_max, ref rec)) { return(false); } rec.normal = -rec.normal; return(true); }
public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec) { var moved = new Ray(ray.original - offset, ray.direction, ray.time); if (!Object.Hit(moved, t_min, t_max, ref rec)) { return(false); } rec.p += offset; return(true); }
public override bool Hit(Ray ray, float t_min, float t_max, ref HitRecord rec) { HitRecord rec1 = new HitRecord(), rec2 = new HitRecord(); if (boundary.Hit(ray, -float.MaxValue, float.MaxValue, ref rec1)) { if (boundary.Hit(ray, rec1.t + 0.0001f, float.MaxValue, ref rec2)) { rec1.t = Mathf.Range(rec1.t, t_min, t_max); if (rec1.t < t_min) { rec1.t = t_min; } if (rec2.t > t_max) { rec2.t = t_max; } if (rec1.t >= rec2.t) { return(false); } if (rec1.t < 0) { rec1.t = 0; } float distance_inside_boundary = (rec2.t - rec1.t) * ray.direction.length(); float hit_distance = -(1 / density) * Mathf.Log(Mathematics.Random.Get()); if (hit_distance < distance_inside_boundary) { rec.t = rec1.t + hit_distance / ray.direction.length(); rec.p = ray.GetPoint(rec.t); rec.normal = new Vector3(1, 0, 0); // arbitrary rec.material = phase_function; return(true); } } } return(false); }