diff options
Diffstat (limited to 'engine/xe_image.cpp')
-rw-r--r-- | engine/xe_image.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/engine/xe_image.cpp b/engine/xe_image.cpp index 1ac82e2..cd53663 100644 --- a/engine/xe_image.cpp +++ b/engine/xe_image.cpp @@ -11,6 +11,10 @@ namespace xe { +// +// CONSTRUCTORS AND DECONSTUCTORS +// + Image::Image(const std::string &filename, bool anisotropic) : xeDevice{Engine::getInstance()->xeDevice} { createTextureImage(filename); createTextureImageView(); @@ -24,6 +28,43 @@ Image::~Image() { vkDestroyImageView(xeDevice.device(), textureImageView, nullptr); } +// +// LOADERS AND DELETORS +// + +static std::set<Image*> CREATED_IMAGES{}; +static std::set<Image*> DELETION_QUEUE{}; + +Image* Image::createImage(const std::string &filename, bool anisotropic) { + Image* image = new Image(filename, anisotropic); + CREATED_IMAGES.insert(image); + return image; +} + +void Image::deleteImage(Image* image) { + if(CREATED_IMAGES.count(image)) { + CREATED_IMAGES.erase(image); + DELETION_QUEUE.insert(image); + } +} + +void Image::submitDeleteQueue(bool purge) { + for(Image* image: DELETION_QUEUE) { + try { delete image; } catch(int err) {}; + } + DELETION_QUEUE.clear(); + if (purge) { + for(Image* image: CREATED_IMAGES) { + try { delete image; } catch(int err) {}; + } + CREATED_IMAGES.clear(); + } +} + +// +// IMAGE CREATION FUNCTIONS +// + void Image::createTextureImage(const std::string &filename) { int texWidth, texHeight, texChannels; stbi_uc* pixels = stbi_load(filename.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); @@ -243,6 +284,10 @@ void Image::createTextureSampler(bool anisotropic) { } } +// +// STATIC CREATE IMAGE +// + void Image::createImage(Device& device, uint32_t width, uint32_t height, uint32_t mipLevels, VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory) { VkImageCreateInfo imageInfo{}; @@ -279,6 +324,10 @@ void Image::createImage(Device& device, uint32_t width, uint32_t height, uint32_ vkBindImageMemory(device.device(), image, imageMemory, 0); } +// +// STATIC CREATE IMAGE VIEW +// + VkImageView Image::createImageView(Device& device, VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, uint32_t mipLevels) { VkImageViewCreateInfo viewInfo{}; viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; |