Started refactor to lazily compilable shaders.
This commit is contained in:
@@ -16,52 +16,42 @@ class texture_data_uploader
|
||||
) {
|
||||
|
||||
std::vector<GLuint> texture_ids;
|
||||
std::vector<GLuint> invalid_texture_ids;
|
||||
|
||||
texture_ids.resize(dynamic_data.size());
|
||||
|
||||
glGenTextures(texture_ids.size(), texture_ids.data());
|
||||
|
||||
auto texture_id_it = texture_ids.begin();
|
||||
|
||||
for (std::size_t i{}; i != dynamic_data.size(); ++i)
|
||||
{
|
||||
const auto& texture_id = *texture_id_it;
|
||||
const auto& texture = dynamic_data[i];
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, texture_id);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
GLenum format;
|
||||
switch (texture.components()) {
|
||||
using enum components::texture::flags;
|
||||
case luminance:
|
||||
format = GL_LUMINANCE;
|
||||
break;
|
||||
case luminance | alpha:
|
||||
format = GL_LUMINANCE_ALPHA;
|
||||
break;
|
||||
case red | green | blue:
|
||||
format = GL_RGB;
|
||||
break;
|
||||
case red | green | blue | alpha:
|
||||
format = GL_RGBA;
|
||||
break;
|
||||
default:
|
||||
format = GL_INVALID_ENUM;
|
||||
break;
|
||||
}
|
||||
|
||||
if (format == GL_INVALID_ENUM)
|
||||
{
|
||||
invalid_texture_ids.push_back(texture_id);
|
||||
}
|
||||
else
|
||||
const auto invalid_texture_ids = std::ranges::partition(
|
||||
texture_ids,
|
||||
[](GLuint texture_id)
|
||||
{
|
||||
GLenum format;
|
||||
switch (texture.components()) {
|
||||
using enum components::texture::flags;
|
||||
case luminance:
|
||||
format = GL_LUMINANCE;
|
||||
break;
|
||||
case luminance | alpha:
|
||||
format = GL_LUMINANCE_ALPHA;
|
||||
break;
|
||||
case red | green | blue:
|
||||
format = GL_RGB;
|
||||
break;
|
||||
case red | green | blue | alpha:
|
||||
format = GL_RGBA;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, texture_id);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D, 0,
|
||||
GL_RGBA8,
|
||||
@@ -73,12 +63,16 @@ class texture_data_uploader
|
||||
texture.data()
|
||||
);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
glDeleteTextures(invalid_texture_ids.size(), invalid_texture_ids.data());
|
||||
|
||||
invalid_texture_ids.resize(texture_ids.size() - invalid_texture_ids.size());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user