summaryrefslogtreecommitdiff
path: root/engine/xe_image.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/xe_image.cpp')
-rw-r--r--engine/xe_image.cpp49
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;