aurora-rendering-engine/include/resource/texture.h

166 lines
2.9 KiB
C++

#ifndef ARE_INCLUDE_RESOURCE_TEXTURE_H
#define ARE_INCLUDE_RESOURCE_TEXTURE_H
#include "basic/types.h"
#include <string>
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