def make_sprite_node( sprite: Texture, size: tuple = None, name: str = None, is_two_sided: bool = True, is_transparent: bool = True, parent: NodePath = None, position: Vec3 = None, scale: float = 0.0, ) -> NodePath: """Make flat single-sprite node out of provided data""" # Using WM_clamp instead of WM_mirror, to avoid issue with black 1-pixel # bars appearing on top of spritesheet randomly. # Idk if this needs to have possibility to override it #TODO sprite.set_wrap_u(Texture.WM_clamp) sprite.set_wrap_v(Texture.WM_clamp) # Creating CardMaker frame card = CardMaker(name or sprite.get_name() or "sprite") # This will fail if texture has been generated with no set_orig_file_size() size = size or (sprite.get_orig_file_x_size(), sprite.get_orig_file_y_size()) # Been told that its not in pixels, thus accepting either 1, 2 or 4 values # Kinda jank, I know if len(size) > 3: card.set_frame(-size[0], size[1], -size[2], size[3]) elif len(size) > 1: card.set_frame(-size[0], size[0], -size[1], size[1]) else: card.set_frame(-size[0], size[0], -size[0], size[0]) parent = parent or NodePath() node = parent.attach_new_node(card.generate()) node.set_texture(sprite) # Making it possible to utilize texture's alpha channel settings # This is a float from 0 to 1, but I dont think there is a point to only # show half of actual object's transparency. # Do it manually afterwards if thats what you need if is_transparent: node.set_transparency(1) # Enabling ability to render texture on both front and back of card if is_two_sided: node.set_two_sided(True) # Setting object's position. This is done relatively to parent, thus if you # didnt pass any, it may be a bit janky if position: node.set_pos(*position) if scale and scale > 0: node.set_scale(scale) return node
def _get_columns_and_rows(spritesheet: Texture, sprite_sizes: tuple) -> tuple: columns = int(spritesheet.get_orig_file_x_size() / sprite_sizes[0]) rows = int(spritesheet.get_orig_file_y_size() / sprite_sizes[1]) return (columns, rows)
def _has_remainder(spritesheet: Texture, sprite_sizes: tuple) -> bool: return (spritesheet.get_orig_file_x_size() % sprite_sizes[0]) or ( spritesheet.get_orig_file_y_size() % sprite_sizes[1])