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