void Sphere::Transform(const float4x4 &transform) { assume(transform.HasUniformScale()); assume(!transform.ContainsProjection()); pos = transform.MulPos(pos); r *= transform.Col3(0).Length(); }
void Circle::Transform(const float4x4 &transform) { assume(transform.HasUniformScale()); assume(transform.IsColOrthogonal3()); pos = transform.MulPos(pos); normal = transform.MulDir(normal).Normalized(); r *= transform.Col3(0).Length(); // Scale the radius of the circle. }
void Polygon::Transform(const float4x4 &transform) { for(size_t i = 0; i < p.size(); ++i) p[i] = transform.MulPos(p[i]); }
Ray operator *(const float4x4 &transform, const Ray &ray) { return Ray(transform.MulPos(ray.pos), transform.MulDir(ray.dir)); }
void Ray::Transform(const float4x4 &transform) { pos = transform.MulPos(pos); dir = transform.MulDir(dir); }
Ray operator *(const float4x4 &transform, const Ray &ray) { assume(transform.IsInvertible()); return Ray(transform.MulPos(ray.pos), transform.MulDir(ray.dir).Normalized()); }
Triangle operator *(const float4x4 &transform, const Triangle &t) { return Triangle(transform.MulPos(t.a), transform.MulPos(t.b), transform.MulPos(t.c)); }
Line operator *(const float4x4 &transform, const Line &l) { return Line(transform.MulPos(l.pos), transform.MulDir(l.dir)); }
void Triangle::Transform(const float4x4 &transform) { a = transform.MulPos(a); b = transform.MulPos(b); c = transform.MulPos(c); }
void Polyhedron::Transform(const float4x4 &transform) { for(size_t i = 0; i < v.size(); ++i) v[i] = transform.MulPos(v[i]); ///\todo Add float4x4::BatchTransformPos. }
Ray operator *(const float4x4 &transform, const Ray &ray) { assume(transform.IsInvertible(1e-6f)); // Tundra: use smaller epsilon in order to prevent assumption spam when raycasting to non-uniformly scaled objects. return Ray(transform.MulPos(ray.pos), transform.MulDir(ray.dir).Normalized()); }