26 constexpr quad(point3 p0, point3 p1, point3 p2, point3 p3) noexcept : p0(p0), p1(p1), p2(p2), p3(p3) {}
42 constexpr quad(rectangle
const &rhs) noexcept : p0(get<0>(rhs)), p1(get<1>(rhs)), p2(get<2>(rhs)), p3(get<3>(rhs)) {}
146 hilet t = f32x4{lhs.top()};
147 hilet l = f32x4{lhs.left()};
148 hilet b = f32x4{lhs.bottom()};
149 hilet r = f32x4{lhs.right()};
151 hilet[x, y, z, ones] = transpose(t, l, b, r);
152 hilet square_lengths = x * x + y * y + z * z;
153 hilet inv_lengths = rcp_sqrt(square_lengths);
154 hilet norm_t = t * inv_lengths.xxxx();
155 hilet norm_l = l * inv_lengths.yyyy();
156 hilet norm_b = b * inv_lengths.zzzz();
157 hilet norm_r = r * inv_lengths.wwww();
159 hilet extra_width = rhs.xxxx();
160 hilet extra_height = rhs.yyyy();
162 hilet top_extra = vector3{norm_t * extra_width};
163 hilet left_extra = vector3{norm_l * extra_height};
164 hilet bottom_extra = vector3{norm_b * extra_width};
165 hilet right_extra = vector3{norm_r * extra_height};
167 hilet lengths = rcp(inv_lengths);
169 hilet rhs_times_2 = rhs + rhs;
173 lhs.p0 - bottom_extra - left_extra,
174 lhs.p1 + bottom_extra - right_extra,
175 lhs.p2 - top_extra + left_extra,
176 lhs.p3 + top_extra + right_extra},
177 lengths + rhs_times_2.xyxy()};