예제 #1
0
    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
예제 #2
0
 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