#ifndef ARE_INCLUDE_RESOURCE_TEXTURE_H #define ARE_INCLUDE_RESOURCE_TEXTURE_H #include "basic/types.h" #include namespace are { // Texture format enumeration enum class TextureFormat { R8, RG8, RGB8, RGBA8, R16F, RG16F, RGB16F, RGBA16F, R32F, RG32F, RGB32F, RGBA32F, DEPTH24_STENCIL8 }; // Texture filter mode enum class TextureFilter { NEAREST, LINEAR, NEAREST_MIPMAP_NEAREST, LINEAR_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_LINEAR }; // Texture wrap mode enum class TextureWrap { REPEAT, MIRRORED_REPEAT, CLAMP_TO_EDGE, CLAMP_TO_BORDER }; // Texture resource class Texture { public: // Constructor Texture(); Texture(const Texture &) = delete; Texture &operator=(const Texture &) = delete; Texture(Texture &&other) noexcept; Texture &operator=(Texture &&other) noexcept; // Destructor ~Texture(); /* * @brief Load texture from file * @param path File path * @param generate_mipmaps Generate mipmaps * @return True if loading succeeded */ bool load_from_file(const std::string &path, bool generate_mipmaps = true); /* * @brief Create empty texture * @param width Texture width * @param height Texture height * @param format Texture format * @return True if creation succeeded */ bool create(uint width, uint height, TextureFormat format); /* * @brief Upload data to texture * @param data Pixel data * @param width Data width * @param height Data height * @param format Data format * @return True if upload succeeded */ bool upload(const void *data, uint width, uint height, TextureFormat format); /* * @brief Set texture filter mode * @param min_filter Minification filter * @param mag_filter Magnification filter */ void set_filter(TextureFilter min_filter, TextureFilter mag_filter); /* * @brief Set texture wrap mode * @param wrap_s Wrap mode for S coordinate * @param wrap_t Wrap mode for T coordinate */ void set_wrap(TextureWrap wrap_s, TextureWrap wrap_t); // Generate mipmaps void generate_mipmaps(); /* * @brief Bind texture to texture unit * @param unit Texture unit */ void bind(uint unit) const; // Unbind texture void unbind() const; // Release texture resources void release(); /* * @brief Get texture handle * @return Texture handle */ TextureHandle get_handle() const { return handle_; } /* * @brief Get texture width * @return Width */ uint get_width() const { return width_; } /* * @brief Get texture height * @return Height */ uint get_height() const { return height_; } /* * @brief Get texture format * @return Format */ TextureFormat get_format() const { return format_; } /* * @brief Check if texture is valid * @return True if valid */ bool is_valid() const { return handle_ != INVALID_HANDLE; } private: TextureHandle handle_; uint width_; uint height_; TextureFormat format_; bool has_mipmaps_; }; } // namespace are #endif // ARE_INCLUDE_RESOURCE_TEXTURE_H