Beispiel #1
0
 def raycast_bbox(self, start, end):
     pos = PathNode(uncenter_position(start, self.col.bbox))
     path = end - start
     if not path:
         return True
     depth = Vector3(*map(lambda a: a[0] * a[1], zip(path.norm(), self.col.bbox)))
     i, r = divmod(path.dist(), depth.dist())
     for j in range(int(i)):
         pos += depth
         if not self.get_block(pos.floor() - Vector3(0, 1, 0)).bounding_box:
             return False
         if any(self.col.block_collision(pos)):
             return False
     return True
Beispiel #2
0
 def raycast_bbox(self, start, end):
     pos = PathNode(uncenter_position(start, self.col.bbox))
     path = end - start
     if not path:
         return True
     depth = Vector3(
         *map(lambda a: a[0] * a[1], zip(path.norm(), self.col.bbox))
     )
     i, r = divmod(path.dist(), depth.dist())
     for j in range(int(i)):
         pos += depth
         if not self.get_block(pos.floor() - Vector3(0, 1, 0)).bounding_box:
             return False
         if any(self.col.block_collision(pos)):
             return False
     return True
Beispiel #3
0
 def get_mtv(self):
     pos = self.pos + self.vec
     pos = collision.uncenter_position(pos, self.col.bbox)
     q = collections.deque((Vector3(),))
     while q:
         current_vector = q.popleft()
         transform_vectors = self.col.check_collision(pos, current_vector)
         if not all(transform_vectors):
             break
         for vector in transform_vectors:
             test_vec = self.vec + current_vector + vector
             if test_vec.dist_sq() <= self.vec.dist_sq() + FP_MAGIC:
                 q.append(current_vector + vector)
     else:
         logger.debug('Physics failed to generate an MTV, bailing out')
         self.vec.zero()
         return Vector3()
     possible_mtv = [current_vector]
     while q:
         current_vector = q.popleft()
         transform_vectors = self.col.check_collision(pos, current_vector)
         if not all(transform_vectors):
             possible_mtv.append(current_vector)
     return min(possible_mtv)
Beispiel #4
0
 def get_mtv(self):
     pos = self.pos + self.vec
     pos = collision.uncenter_position(pos, self.col.bbox)
     q = collections.deque((Vector3(),))
     while q:
         current_vector = q.popleft()
         transform_vectors = self.col.check_collision(pos, current_vector)
         if not all(transform_vectors):
             break
         for vector in transform_vectors:
             test_vec = self.vec + current_vector + vector
             if test_vec.dist_sq() <= self.vec.dist_sq() + FP_MAGIC:
                 q.append(current_vector + vector)
     else:
         logger.warn('Physics failed to generate an MTV, bailing out')
         self.vec.zero()
         return Vector3()
     possible_mtv = [current_vector]
     while q:
         current_vector = q.popleft()
         transform_vectors = self.col.check_collision(pos, current_vector)
         if not all(transform_vectors):
             possible_mtv.append(current_vector)
     return min(possible_mtv)