bool InstancePrimitive::Intersect(const Ray &r, Intersection *isect) const { Ray ray = WorldToInstance(r); if (!instance->Intersect(ray, isect)) return false; r.maxt = ray.maxt; isect->WorldToObject = isect->WorldToObject * WorldToInstance; // TODO: transform instance's differential geometry to world space return true; }
// InstancePrimitive Method Definitions bool InstancePrimitive::Intersect(const Ray &r, Intersection *isect) const { Ray ray = WorldToInstance(r); if (!instance->Intersect(ray, isect)) return false; r.maxt = ray.maxt; isect->WorldToObject = isect->WorldToObject * WorldToInstance; // Transform instance's differential geometry to world space isect->dg.p = InstanceToWorld(isect->dg.p); isect->dg.nn = Normalize(InstanceToWorld(isect->dg.nn)); isect->dg.dpdu = InstanceToWorld(isect->dg.dpdu); isect->dg.dpdv = InstanceToWorld(isect->dg.dpdv); isect->dg.dndu = InstanceToWorld(isect->dg.dndu); isect->dg.dndv = InstanceToWorld(isect->dg.dndv); return true; }
bool InstancePrimitive::IntersectP(const Ray &r) const { return instance->IntersectP(WorldToInstance(r)); }