public override bool Intersect(Ray r, Intersection isect) { Transform w2p; WorldToPrimitive.Interpolate(r.time, out w2p); Ray ray = w2p.Apply(r); if (!primitive.Intersect(ray, isect)) return false; r.maxt = ray.maxt; isect.primitiveId = primitiveId; if (!w2p.IsIdentity()) { // Compute world-to-object transformation for instance isect.WorldToObject = isect.WorldToObject * w2p; isect.ObjectToWorld = Transform.Inverse isect.WorldToObject.Inverse( // Transform instance's differential geometry to world space Transform PrimitiveToWorld = Inverse(w2p); isect->dg.p = PrimitiveToWorld(isect->dg.p); isect->dg.nn = Normalize(PrimitiveToWorld(isect->dg.nn)); isect->dg.dpdu = PrimitiveToWorld(isect->dg.dpdu); isect->dg.dpdv = PrimitiveToWorld(isect->dg.dpdv); isect->dg.dndu = PrimitiveToWorld(isect->dg.dndu); isect->dg.dndv = PrimitiveToWorld(isect->dg.dndv); } return true; }
public override bool Intersect(Ray r, Intersection isect) { double thit, rayEpsilon; if (!shape.Intersect(r, out thit, out rayEpsilon, out isect.dg)) return false; isect.primitive = this; isect.WorldToObject = shape.WorldToObject; isect.ObjectToWorld = shape.ObjectToWorld; isect.shapeId = shape.shapeId; isect.primitiveId = primitiveId; isect.rayEpsilon = rayEpsilon; r.maxt = thit; return true; }
public abstract bool Intersect(Ray r, Intersection isect);