166 lines
2.9 KiB
C++
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
|