def get_intersection(self, ray: Ray, intersection: Intersection) -> bool: # Refine primitives in voxel if needed if not self.allCanIntersect: for i in range(len(self.primitives)): prim = self.primitives[i] # Refine primitive _prim_ if it's not intersectable if not prim.get_can_intersect(): prims = [] prim.get_fully_refine(prims) assert len(prims) > 0 if len(prims) == 1: self.primitives[i] = prims[0] else: self.primitives[i] = UniformGrid(prims, False) self.allCanIntersect = True # Loop over primitives in voxel and find intersections hitSomething = False intersection_tmp = Intersection() for prim in self.primitives: if prim.get_intersection(ray, intersection_tmp): intersection.differentialGeometry.point = intersection_tmp.differentialGeometry.point intersection.differentialGeometry.normal = intersection_tmp.differentialGeometry.normal intersection.differentialGeometry.shape = intersection_tmp.differentialGeometry.shape intersection.primitive=intersection_tmp.primitive hitSomething = True return hitSomething
def get_intersection(self, ray: Ray, intersection: Intersection) -> bool: hit, thit = self.shape.get_intersection(ray, intersection.differentialGeometry) if not hit: return False intersection.primitive = self intersection.WorldToObject = self.shape.objectToWorld intersection.ObjectToWorld = self.shape.objectToWorld ray.max_t = thit return True