diff --git a/src/engine/texture/Texture.cpp b/src/engine/texture/Texture.cpp index e949abe..76709ce 100644 --- a/src/engine/texture/Texture.cpp +++ b/src/engine/texture/Texture.cpp @@ -9,21 +9,26 @@ #include "engine/FrameInfo.hpp" #include "engine/buffers/BufferSuballocation.hpp" #include "engine/descriptors/DescriptorSet.hpp" +#include "engine/image/Image.hpp" #include "engine/image/ImageView.hpp" +#include "engine/logging/logging.hpp" +#include "engine/math/noise/perlin/generator.hpp" #include "objectloaders/stb_image.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Weffc++" #pragma GCC diagnostic ignored "-Wold-style-cast" #pragma GCC diagnostic ignored "-Wconversion" -#include "engine/math/noise/perlin/generator.hpp" #include "imgui/backends/imgui_impl_vulkan.h" #pragma GCC diagnostic pop -#include "engine/logging/logging.hpp" - namespace fgl::engine { + std::uint64_t getNextID() + { + static std::uint64_t id { 0 }; + return id++; + } std::tuple< std::vector< std::byte >, int, int, vk::Format > loadTexture( const std::filesystem::path& path, const vk::Format format ) @@ -53,6 +58,12 @@ namespace fgl::engine void Texture::drawImGui( vk::Extent2D extent ) { + if ( !isReady() ) + { + log::debug( "Unable to draw Image {}. Image not ready", this->getID() ); + return; + } + if ( m_imgui_set == VK_NULL_HANDLE ) createImGuiSet(); if ( extent == vk::Extent2D() ) @@ -95,10 +106,10 @@ namespace fgl::engine {} Texture::Texture( const std::vector< std::byte >& data, const vk::Extent2D extent, const vk::Format format ) : - m_extent( extent ) + m_extent( extent ), + m_texture_id( getNextID() ) { ZoneScoped; - static TextureID tex_counter { 0 }; auto image = std::make_shared< Image >( extent, @@ -109,8 +120,6 @@ namespace fgl::engine m_image_view = image->getView(); - m_texture_id = tex_counter++; - m_staging = std::make_unique< BufferSuballocation >( getGlobalStagingBuffer(), data.size() ); //Copy data info buffer std::memcpy( reinterpret_cast< unsigned char* >( m_staging->ptr() ), data.data(), data.size() ); @@ -125,6 +134,18 @@ namespace fgl::engine if ( m_imgui_set != VK_NULL_HANDLE ) ImGui_ImplVulkan_RemoveTexture( m_imgui_set ); } + void Texture::stage() + { + auto command_buffer { Device::getInstance().beginSingleTimeCommands() }; + + stage( command_buffer ); + + Device::getInstance().endSingleTimeCommands( command_buffer ); + + setReady(); + m_staging.reset(); + } + void Texture::stage( vk::raii::CommandBuffer& cmd ) { ZoneScoped; @@ -200,8 +221,7 @@ namespace fgl::engine void Texture::dropStaging() { - assert( m_staging ); - m_staging.reset(); + if ( m_staging ) m_staging.reset(); } vk::DescriptorImageInfo Texture::getDescriptor() const @@ -222,7 +242,14 @@ namespace fgl::engine void Texture::createImGuiSet() { + if ( !this->isReady() ) + { + log::debug( "Unable to create ImGui set. Texture was not ready" ); + return; + } + #if ENABLE_IMGUI + log::debug( "Created ImGui set for image ID {}", this->getID() ); if ( m_imgui_set != VK_NULL_HANDLE ) return; auto& view { m_image_view }; @@ -245,6 +272,12 @@ namespace fgl::engine return m_imgui_set; } + Texture::Texture( Image& image, Sampler sampler ) : m_image_view( image.getView() ), m_texture_id( getNextID() ) + { + m_image_view->getSampler() = std::move( sampler ); + setReady(); + } + TextureID Texture::getID() const { assert( !m_staging ); diff --git a/src/engine/texture/Texture.hpp b/src/engine/texture/Texture.hpp index c7097ad..f152572 100644 --- a/src/engine/texture/Texture.hpp +++ b/src/engine/texture/Texture.hpp @@ -59,12 +59,16 @@ namespace fgl::engine ~Texture(); + void stage(); + Texture( const Texture& ) = delete; Texture& operator=( const Texture& ) = delete; Texture( Texture&& other ) = delete; Texture& operator=( Texture&& ) = delete; + Texture( Image& image, Sampler sampler = Sampler() ); + [[nodiscard]] TextureID getID() const; [[nodiscard]] vk::DescriptorImageInfo getDescriptor() const;