49f7a3e2d7
The problem was caused by vector re-allocation. This is a similar problem to what happened with the mesh factory. It was solved by converting the texture factory to use lists instead of vectors. The reason for using lists is to prevent the need for explicit deallocation of resources and instead allow the use of a list to automatically allocate/deallocate the textures/samplers/meshes.
56 lines
1.3 KiB
C++
56 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <list>
|
|
|
|
#include "ImageLoader.h"
|
|
|
|
#include "Texture.h"
|
|
#include "Sampler.h"
|
|
|
|
namespace charcoal
|
|
{
|
|
class TextureFactory
|
|
{
|
|
private:
|
|
TextureFactory() {}
|
|
virtual ~TextureFactory() {}
|
|
|
|
public:
|
|
template <typename T>
|
|
static Texture* gen_texture(
|
|
Texture::Format data_format,
|
|
Texture::Type data_type,
|
|
unsigned long width,
|
|
unsigned long height,
|
|
const std::vector<T>& data,
|
|
Texture::InternalFormat internal_format,
|
|
unsigned short mipmap_level = 0,
|
|
Texture::Target texture_target = Texture::Target::TEXTURE_2D
|
|
)
|
|
{
|
|
m_textures.emplace_back(data_format, data_type, width, height, data, internal_format, mipmap_level, texture_target);
|
|
return &m_textures.back();
|
|
}
|
|
|
|
static Texture* gen_image_texture(const image_loader::ImageRGBA& image)
|
|
{
|
|
return gen_texture(Texture::Format::RGBA, Texture::Type::UNSIGNED_BYTE, image.width, image.height, image.data, Texture::InternalFormat::RGBA);
|
|
}
|
|
|
|
static Sampler* gen_sampler(
|
|
Sampler::Wrap wrap_s,
|
|
Sampler::Wrap wrap_t,
|
|
Sampler::MagFilter magnification_filter,
|
|
Sampler::MinFilter minification_filter
|
|
)
|
|
{
|
|
m_samplers.emplace_back(wrap_s, wrap_t, magnification_filter, minification_filter);
|
|
return &m_samplers.back();
|
|
}
|
|
|
|
private:
|
|
static std::list<Texture> m_textures;
|
|
static std::list<Sampler> m_samplers;
|
|
};
|
|
}
|