From 68f2e407f17050134c17f97b331b6ff574c8c3d0 Mon Sep 17 00:00:00 2001 From: Maximilian Giller Date: Mon, 5 Jun 2023 00:12:17 +0200 Subject: [PATCH] Improved configuration of texture assets. Added VersatileSprite and proper factory --- CMakeLists.txt | 2 +- assets/{player.png => edge.png} | Bin src/game/game_object.cpp | 5 ++ src/game/game_object.h | 1 + src/game/input/input_identity.h | 1 + src/game/player/player.cpp | 17 +--- src/game/player/player.hpp | 5 +- src/game/player/player_spawner.cpp | 2 +- src/game/player/player_spawner.hpp | 1 + src/sprites/animated_sprite.cpp | 9 ++- src/sprites/animated_sprite.hpp | 8 +- src/sprites/configs/animation_config.hpp | 27 +++++++ src/sprites/configs/sheet_config.hpp | 20 +++++ src/sprites/configs/sprite_config.hpp | 32 ++++++++ src/sprites/single_sprite.cpp | 6 ++ src/sprites/single_sprite.hpp | 14 ++-- src/sprites/sprite.hpp | 18 +++++ src/sprites/sprite_factory.cpp | 97 +++++++++++++++++++++++ src/sprites/sprite_factory.hpp | 21 +++++ src/sprites/sprite_sheet.cpp | 6 +- src/sprites/sprite_sheet.hpp | 3 +- src/sprites/versatile_sprite.cpp | 49 ++++++++++++ src/sprites/versatile_sprite.hpp | 27 +++++++ src/texture_config.h | 38 ++++++++- 24 files changed, 378 insertions(+), 31 deletions(-) rename assets/{player.png => edge.png} (100%) create mode 100644 src/sprites/configs/animation_config.hpp create mode 100644 src/sprites/configs/sheet_config.hpp create mode 100644 src/sprites/configs/sprite_config.hpp create mode 100644 src/sprites/sprite.hpp create mode 100644 src/sprites/sprite_factory.cpp create mode 100644 src/sprites/sprite_factory.hpp create mode 100644 src/sprites/versatile_sprite.cpp create mode 100644 src/sprites/versatile_sprite.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 56f18a7..f755655 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,7 @@ set(SOURCES src/game/camera/tracking_area.h src/game/camera/tracking_view_options.hpp src/game/collectables/environment_collectable.cpp - src/game/collectables/environment_collectable.hpp src/sprites/texture_manager.cpp src/sprites/texture_manager.hpp src/sprites/sprite_sheet.cpp src/sprites/sprite_sheet.hpp src/sprites/animated_sprite.cpp src/sprites/animated_sprite.hpp src/sprites/single_sprite.cpp src/sprites/single_sprite.hpp src/texture_config.h) + src/game/collectables/environment_collectable.hpp src/sprites/texture_manager.cpp src/sprites/texture_manager.hpp src/sprites/sprite_sheet.cpp src/sprites/sprite_sheet.hpp src/sprites/animated_sprite.cpp src/sprites/animated_sprite.hpp src/sprites/single_sprite.cpp src/sprites/single_sprite.hpp src/texture_config.h src/sprites/configs/sprite_config.hpp src/sprites/configs/sheet_config.hpp src/sprites/configs/animation_config.hpp src/sprites/versatile_sprite.cpp src/sprites/versatile_sprite.hpp src/sprites/sprite.hpp src/sprites/sprite_factory.cpp src/sprites/sprite_factory.hpp) set(PHYSICS_00_SOURCES src/prototypes/physics_00.cpp) diff --git a/assets/player.png b/assets/edge.png similarity index 100% rename from assets/player.png rename to assets/edge.png diff --git a/src/game/game_object.cpp b/src/game/game_object.cpp index ee7989a..d342608 100644 --- a/src/game/game_object.cpp +++ b/src/game/game_object.cpp @@ -52,3 +52,8 @@ void GameObject::addChildWorldOffset(const std::shared_ptr &child, W children.push_back(child); child->coordinates->setParent(coordinates, offset); } + +void GameObject::addChild(const std::shared_ptr &child) +{ + addChildWorldOffset(child, {0, 0}); +} diff --git a/src/game/game_object.h b/src/game/game_object.h index 3bc490d..e14c405 100644 --- a/src/game/game_object.h +++ b/src/game/game_object.h @@ -23,6 +23,7 @@ public: void addChildScreenOffset(const std::shared_ptr &child, IsometricCoordinates offset = {0, 0}); void addChildWorldOffset(const std::shared_ptr &child, WorldCoordinates offset); + void addChild(const std::shared_ptr &child); std::vector> getChildren() const { return children; } std::shared_ptr coordinates; diff --git a/src/game/input/input_identity.h b/src/game/input/input_identity.h index 1d92108..93f5542 100644 --- a/src/game/input/input_identity.h +++ b/src/game/input/input_identity.h @@ -6,6 +6,7 @@ #include "input_device_group.h" #include "key_features.hpp" #include "../../utilities/magic_enum.hpp" +#include "../../logging/easylogging++.h" struct InputIdentity diff --git a/src/game/player/player.cpp b/src/game/player/player.cpp index 7e63c0f..c2620c7 100644 --- a/src/game/player/player.cpp +++ b/src/game/player/player.cpp @@ -1,25 +1,16 @@ #include "player.hpp" -#include "../../sprites/texture_manager.hpp" -#include "../../sprites/single_sprite.hpp" -#include "../../sprites/animated_sprite.hpp" -#include "../../sprites/sprite_sheet.hpp" #include -Player::Player(std::shared_ptr assignedInput, const std::string &image, WorldCoordinates initCoordinates) +Player::Player(std::shared_ptr assignedInput, const std::string &skinRessourceName, + WorldCoordinates initCoordinates) { coordinates->set(initCoordinates); input = std::move(assignedInput); -// auto sprite = std::make_shared(TextureManager::getInstance()->getTexture(image), -// sf::Vector2f{width, width}); -// addChildScreenOffset(sprite, {-width / 2.f, -width / 2.f}); - - auto spriteSheet = std::make_shared(TextureManager::getInstance()->getTexture(image), 4, 2); - auto animatedSprite = spriteSheet->getAnimation(0, 8); - animatedSprite->setSize({width, width}); - addChildScreenOffset(animatedSprite, {-width / 2.f, -width / 2.f}); + auto sprite = std::make_shared(skinRessourceName, sf::Vector2f{width, width}); + addChildScreenOffset(sprite, {-width / 2.f, -width / 2.f}); } sf::Vector2f Player::getTrackablePosition() const diff --git a/src/game/player/player.hpp b/src/game/player/player.hpp index b3fd4f3..d48014e 100644 --- a/src/game/player/player.hpp +++ b/src/game/player/player.hpp @@ -3,12 +3,13 @@ #include "../game_object.h" #include "../camera/ITrackable.h" -#include "../../primitives/circle_object.h" +#include "../../sprites/versatile_sprite.hpp" +#include "../input/input_identity.h" class Player : public GameObject, public ITrackable { public: - Player(std::shared_ptr assignedInput, const std::string& image, WorldCoordinates initCoordinates); + Player(std::shared_ptr assignedInput, const std::string& skinRessourceName, WorldCoordinates initCoordinates); ~Player(); diff --git a/src/game/player/player_spawner.cpp b/src/game/player/player_spawner.cpp index a9f0a56..8503730 100644 --- a/src/game/player/player_spawner.cpp +++ b/src/game/player/player_spawner.cpp @@ -7,7 +7,7 @@ void PlayerSpawner::update() // Create player for new input identities for (auto &inputIdentity: InputMapper::getInstance()->newInputIdentities) { - auto player = new Player(inputIdentity, PLAYER_TEXTURE, {0, 0}); + auto player = new Player(inputIdentity, PLAYER_SKIN, {0, 0}); Game::getInstance()->addGameObject(player); Game::getInstance()->views[0]->addTrackable(player); } diff --git a/src/game/player/player_spawner.hpp b/src/game/player/player_spawner.hpp index 06ad24a..9bcea14 100644 --- a/src/game/player/player_spawner.hpp +++ b/src/game/player/player_spawner.hpp @@ -3,6 +3,7 @@ #include "../game_object.h" +#include "../game.h" class PlayerSpawner : public GameObject { diff --git a/src/sprites/animated_sprite.cpp b/src/sprites/animated_sprite.cpp index 997b391..04bd42f 100644 --- a/src/sprites/animated_sprite.cpp +++ b/src/sprites/animated_sprite.cpp @@ -2,7 +2,7 @@ #include "../config.h" #include "../logging/easylogging++.h" -AnimatedSprite::AnimatedSprite(const std::vector &sprites, const sf::Vector2f& size) +AnimatedSprite::AnimatedSprite(const std::vector &sprites, const sf::Vector2f &size) { this->sprites = sprites; setSize(size); @@ -37,3 +37,10 @@ void AnimatedSprite::setSize(const sf::Vector2f &size) sprite.setScale(size.x / sprite.getTextureRect().width, size.y / sprite.getTextureRect().height); } } + +sf::Vector2f AnimatedSprite::getSize() const +{ + auto scale = sprites[currentFrame].getScale(); + auto textureSize = sprites[currentFrame].getTextureRect(); + return {textureSize.width * scale.x, textureSize.height * scale.y}; +} diff --git a/src/sprites/animated_sprite.hpp b/src/sprites/animated_sprite.hpp index ea7a345..907bc4c 100644 --- a/src/sprites/animated_sprite.hpp +++ b/src/sprites/animated_sprite.hpp @@ -4,8 +4,9 @@ #include #include "../game/game_object.h" +#include "sprite.hpp" -class AnimatedSprite : public GameObject +class AnimatedSprite : public GameObject, public Sprite { public: AnimatedSprite(const std::vector& sprites, const sf::Vector2f& size = sf::Vector2f(0, 0)); @@ -16,13 +17,14 @@ public: sf::Time frameDuration = sf::seconds(0.1f); - void setSize(const sf::Vector2f &size); + void setSize(const sf::Vector2f &size) override; + + sf::Vector2f getSize() const override; private: int currentFrame = 0; sf::Time timeSinceLastFrame = sf::Time::Zero; std::vector sprites; - }; diff --git a/src/sprites/configs/animation_config.hpp b/src/sprites/configs/animation_config.hpp new file mode 100644 index 0000000..6d816d2 --- /dev/null +++ b/src/sprites/configs/animation_config.hpp @@ -0,0 +1,27 @@ +#ifndef HOLESOME_ANIMATION_CONFIG_HPP +#define HOLESOME_ANIMATION_CONFIG_HPP + +#include +#include +#include +#include + +struct AnimationConfig +{ + std::string sheetName; + int startingSheetIndex; + int frameCount; + sf::Time frameDuration; + sf::Vector2f size; + + AnimationConfig(std::string sheetName, int startingSheetIndex, int frameCount, sf::Time frameDuration, + sf::Vector2f size = sf::Vector2f(0, 0)) : + sheetName(std::move(sheetName)), + startingSheetIndex(startingSheetIndex), + frameCount(frameCount), + frameDuration(frameDuration), + size(size) + {} +}; + +#endif //HOLESOME_ANIMATION_CONFIG_HPP diff --git a/src/sprites/configs/sheet_config.hpp b/src/sprites/configs/sheet_config.hpp new file mode 100644 index 0000000..4b245b3 --- /dev/null +++ b/src/sprites/configs/sheet_config.hpp @@ -0,0 +1,20 @@ +#ifndef HOLESOME_SHEET_CONFIG_HPP +#define HOLESOME_SHEET_CONFIG_HPP + +#include +#include + +struct SheetConfig +{ + std::string textureName; + int columns; + int rows; + + SheetConfig(std::string textureName, int columns, int rows) : + textureName(std::move(textureName)), + columns(columns), + rows(rows) + {} +}; + +#endif //HOLESOME_SHEET_CONFIG_HPP diff --git a/src/sprites/configs/sprite_config.hpp b/src/sprites/configs/sprite_config.hpp new file mode 100644 index 0000000..b11affa --- /dev/null +++ b/src/sprites/configs/sprite_config.hpp @@ -0,0 +1,32 @@ +#ifndef HOLESOME_SPRITE_CONFIG_HPP +#define HOLESOME_SPRITE_CONFIG_HPP + +#include +#include +#include + +struct SpriteConfig +{ + std::string resourceName; + bool isFromSheet; + int sheetIndex; + sf::Vector2f size; + + SpriteConfig(std::string sheetName, int sheetIndex, sf::Vector2f size = sf::Vector2f(0, 0)) + : + resourceName(std::move(sheetName)), + sheetIndex(sheetIndex), + size(size), + isFromSheet(true) + {} + + SpriteConfig(std::string textureName, sf::Vector2f size = sf::Vector2f(0, 0)) + : + resourceName(std::move(textureName)), + sheetIndex(0), + size(size), + isFromSheet(false) + {} +}; + +#endif //HOLESOME_SPRITE_CONFIG_HPP diff --git a/src/sprites/single_sprite.cpp b/src/sprites/single_sprite.cpp index fcb2d52..8fe4b44 100644 --- a/src/sprites/single_sprite.cpp +++ b/src/sprites/single_sprite.cpp @@ -35,3 +35,9 @@ void SingleSprite::setSize(const sf::Vector2f &size) auto textureSize = sprite.getTextureRect(); sprite.setScale(size.x / textureSize.width, size.y / textureSize.height); } + +sf::Vector2f SingleSprite::getSize() const +{ + auto textureSize = sprite.getTextureRect(); + return {textureSize.width * sprite.getScale().x, textureSize.height * sprite.getScale().y}; +} diff --git a/src/sprites/single_sprite.hpp b/src/sprites/single_sprite.hpp index f1e93db..d6430c1 100644 --- a/src/sprites/single_sprite.hpp +++ b/src/sprites/single_sprite.hpp @@ -4,21 +4,25 @@ #include #include "../game/game_object.h" +#include "sprite.hpp" -class SingleSprite : public GameObject +class SingleSprite : public GameObject, public Sprite { public: - SingleSprite(const sf::Sprite& sprite, const sf::Vector2f& size = sf::Vector2f(0, 0)); - SingleSprite(const std::shared_ptr& texture, const sf::Vector2f& size = sf::Vector2f(0, 0)); + SingleSprite(const sf::Sprite &sprite, const sf::Vector2f &size = sf::Vector2f(0, 0)); + + SingleSprite(const std::shared_ptr &texture, const sf::Vector2f &size = sf::Vector2f(0, 0)); void draw(sf::RenderWindow *window) const override; void lateUpdate() override; + void setSize(const sf::Vector2f &size) override; + + sf::Vector2f getSize() const override; + private: sf::Sprite sprite; - - void setSize(const sf::Vector2f &size); }; diff --git a/src/sprites/sprite.hpp b/src/sprites/sprite.hpp new file mode 100644 index 0000000..fd7302e --- /dev/null +++ b/src/sprites/sprite.hpp @@ -0,0 +1,18 @@ +#ifndef HOLESOME_SPRITE_HPP +#define HOLESOME_SPRITE_HPP + +#include +#include +#include + +class Sprite +{ +public: + virtual void setSize(const sf::Vector2f &size) + {} + + virtual sf::Vector2f getSize() const + { return {0, 0}; } +}; + +#endif //HOLESOME_SPRITE_HPP diff --git a/src/sprites/sprite_factory.cpp b/src/sprites/sprite_factory.cpp new file mode 100644 index 0000000..551d9c4 --- /dev/null +++ b/src/sprites/sprite_factory.cpp @@ -0,0 +1,97 @@ +#include "sprite_factory.hpp" +#include "../texture_config.h" +#include "texture_manager.hpp" + +std::shared_ptr SpriteFactory::createSingleSprite(const std::string& name, sf::Vector2f size) +{ + // Get sprite config + auto sprite_config = all_sprites.find(name); + + if (sprite_config == all_sprites.end()) + { + LOG(ERROR) << "Sprite " << name << " not found. Could not create single sprite."; + return nullptr; + } + + // Construct sprite + auto config = sprite_config->second; + + // Construct simply from texture + if (!config.isFromSheet) + { + auto texture = TextureManager::getInstance()->getTexture(config.resourceName); + if (texture == nullptr) + { + LOG(ERROR) << "Texture " << config.resourceName << " not found. Could not create single sprite."; + return nullptr; + } + + LOG(INFO) << "Creating single sprite from texture " << config.resourceName; + return std::make_shared(texture, size); + } + + // Construct from sheet + auto sheet = createSheet(config.resourceName); + if (sheet == nullptr) + { + LOG(ERROR) << "Sheet " << config.resourceName << " not found. Could not create single sprite."; + return nullptr; + } + + LOG(INFO) << "Creating single sprite from sheet " << config.resourceName; + auto sprite = sheet->getSprite(config.sheetIndex); + sprite->setSize(size); + return sprite; +} + +std::shared_ptr SpriteFactory::createAnimatedSprite(const std::string& name, sf::Vector2f size) +{ + // Get animation config + auto animation_config = all_animations.find(name); + + if (animation_config == all_animations.end()) + { + LOG(ERROR) << "Animation " << name << " not found. Could not create animated sprite."; + return nullptr; + } + + // Construct animation + auto config = animation_config->second; + auto sheet = createSheet(config.sheetName); + if (sheet == nullptr) + { + LOG(ERROR) << "Sheet " << config.sheetName << " not found. Could not create animated sprite."; + return nullptr; + } + + LOG(INFO) << "Creating animated sprite from sheet " << config.sheetName; + auto animation = sheet->getAnimation(config.startingSheetIndex, config.frameCount); + animation->frameDuration = config.frameDuration; + animation->setSize(size); + + return animation; +} + +std::shared_ptr SpriteFactory::createSheet(const std::string& name) +{ + // Get config + auto sheet_config = all_sheets.find(name); + + if (sheet_config == all_sheets.end()) + { + LOG(ERROR) << "Sheet " << name << " not found. Could not create sheet."; + return nullptr; + } + + // Construct sheet + auto config = sheet_config->second; + auto texture = TextureManager::getInstance()->getTexture(config.textureName); + if (texture == nullptr) + { + LOG(ERROR) << "Texture " << config.textureName << " not found. Could not create sheet."; + return nullptr; + } + + LOG(INFO) << "Creating sheet " << name; + return std::make_shared(texture, config.columns, config.rows); +} diff --git a/src/sprites/sprite_factory.hpp b/src/sprites/sprite_factory.hpp new file mode 100644 index 0000000..b6f55ad --- /dev/null +++ b/src/sprites/sprite_factory.hpp @@ -0,0 +1,21 @@ +#ifndef HOLESOME_SPRITE_FACTORY_HPP +#define HOLESOME_SPRITE_FACTORY_HPP + + +#include +#include +#include "single_sprite.hpp" +#include "animated_sprite.hpp" +#include "sprite_sheet.hpp" +#include "../logging/easylogging++.h" + +class SpriteFactory +{ +public: + static std::shared_ptr createSingleSprite(const std::string& name, sf::Vector2f size = sf::Vector2f(0, 0)); + static std::shared_ptr createAnimatedSprite(const std::string& name, sf::Vector2f size = sf::Vector2f(0, 0)); + static std::shared_ptr createSheet(const std::string& name); +}; + + +#endif //HOLESOME_SPRITE_FACTORY_HPP diff --git a/src/sprites/sprite_sheet.cpp b/src/sprites/sprite_sheet.cpp index ddc77f6..ef2c308 100644 --- a/src/sprites/sprite_sheet.cpp +++ b/src/sprites/sprite_sheet.cpp @@ -1,4 +1,5 @@ #include "sprite_sheet.hpp" +#include "single_sprite.hpp" SpriteSheet::SpriteSheet(const std::shared_ptr& texture, int columns, int rows) { @@ -18,13 +19,14 @@ SpriteSheet::SpriteSheet(const std::shared_ptr& texture, int column } } -sf::Sprite SpriteSheet::getSprite(int sequenceIndex) const +std::shared_ptr SpriteSheet::getSprite(int sequenceIndex) const { if (sequenceIndex < 0 || sequenceIndex >= sprites.size()) { throw std::runtime_error("Invalid sequence index"); } - return sprites[sequenceIndex]; + auto sprite = sprites[sequenceIndex]; + return std::make_shared(sprite); } std::shared_ptr SpriteSheet::getAnimation(int startingSequenceIndex, int numberOfFrames) const diff --git a/src/sprites/sprite_sheet.hpp b/src/sprites/sprite_sheet.hpp index 0c25a22..ff4b0f9 100644 --- a/src/sprites/sprite_sheet.hpp +++ b/src/sprites/sprite_sheet.hpp @@ -6,13 +6,14 @@ #include #include #include "animated_sprite.hpp" +#include "single_sprite.hpp" class SpriteSheet { public: SpriteSheet(const std::shared_ptr& texture, int columns, int rows); - sf::Sprite getSprite(int sequenceIndex) const; + std::shared_ptr getSprite(int sequenceIndex) const; std::shared_ptr getAnimation(int startingSequenceIndex, int numberOfFrames) const; diff --git a/src/sprites/versatile_sprite.cpp b/src/sprites/versatile_sprite.cpp new file mode 100644 index 0000000..02b4a18 --- /dev/null +++ b/src/sprites/versatile_sprite.cpp @@ -0,0 +1,49 @@ +#include "versatile_sprite.hpp" +#include "sprite_factory.hpp" +#include "../texture_config.h" + +VersatileSprite::VersatileSprite(const std::string &name, sf::Vector2f size) +{ + // Try to find in sprites + if (all_sprites.find(name) != all_sprites.end()) + { + singleSprite = SpriteFactory::createSingleSprite(name, size); + addChild(singleSprite); + } else if (all_animations.find(name) != all_animations.end()) + { + animatedSprite = SpriteFactory::createAnimatedSprite(name, size); + addChild(animatedSprite); + } else + { + LOG(ERROR) << "Sprite " << name << " not found. Could not create versatile sprite."; + return; + } +} + +void VersatileSprite::setSize(const sf::Vector2f &size) +{ + if (singleSprite != nullptr) + { + singleSprite->setSize(size); + } else if (animatedSprite != nullptr) + { + animatedSprite->setSize(size); + } else + { + Sprite::setSize(size); + } +} + +sf::Vector2f VersatileSprite::getSize() const +{ + if (singleSprite != nullptr) + { + return singleSprite->getSize(); + } else if (animatedSprite != nullptr) + { + return animatedSprite->getSize(); + } else + { + return Sprite::getSize(); + } +} diff --git a/src/sprites/versatile_sprite.hpp b/src/sprites/versatile_sprite.hpp new file mode 100644 index 0000000..7c97978 --- /dev/null +++ b/src/sprites/versatile_sprite.hpp @@ -0,0 +1,27 @@ +#ifndef HOLESOME_VERSATILE_SPRITE_HPP +#define HOLESOME_VERSATILE_SPRITE_HPP + + +#include +#include +#include "sprite.hpp" +#include "../game/game_object.h" +#include "single_sprite.hpp" +#include "animated_sprite.hpp" + +class VersatileSprite : public GameObject, public Sprite +{ +public: + VersatileSprite(const std::string& name, sf::Vector2f size = sf::Vector2f(0, 0)); + + void setSize(const sf::Vector2f &size) override; + + sf::Vector2f getSize() const override; + +private: + std::shared_ptr singleSprite = nullptr; + std::shared_ptr animatedSprite = nullptr; +}; + + +#endif //HOLESOME_VERSATILE_SPRITE_HPP diff --git a/src/texture_config.h b/src/texture_config.h index d63144c..c16c821 100644 --- a/src/texture_config.h +++ b/src/texture_config.h @@ -3,11 +3,45 @@ #include #include +#include "sprites/configs/animation_config.hpp" +#include "sprites/configs/sheet_config.hpp" +#include "sprites/configs/sprite_config.hpp" -#define PLAYER_TEXTURE "player" +#define PLAYER_SKIN "edge" +/** + * All textures used in the game. + * The key is the name of the texture, the value is the path to the texture. + */ std::map const all_textures = { - {PLAYER_TEXTURE, "assets/numbers.png"} + {"numbers", "assets/numbers.png"}, + {"64", "assets/64.png"}, + {"edge", "assets/edge.png"} +}; + +/** + * All sheets used in the game. + * The key is the name of the sheet, the value is the sheet config. + */ +std::map const all_sheets = { + {"numbers", SheetConfig("numbers", 4, 2)} +}; + +/** + * All animations used in the game. + * The key is the name of the animation, the value is the animation config. + */ +std::map const all_animations = { + {"numbers", AnimationConfig("numbers", 0, 8, sf::seconds(0.1f))} +}; + +/** + * All sprites used in the game. + * The key is the name of the singleSprite, the value is the singleSprite config. + */ +std::map const all_sprites = { + {"64", SpriteConfig("64")}, + {"edge", SpriteConfig("edge")} }; #endif //HOLESOME_TEXTURE_CONFIG_H