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);