33 lines
1.2 KiB
C++
33 lines
1.2 KiB
C++
#include "material.h"
|
|
#include "shader.h"
|
|
|
|
GpuMaterial::GpuMaterial(Material const &material) : shader(material.shader)
|
|
{
|
|
int texture_unit_counter = 0;
|
|
|
|
if (material.base_color_texture.has_value()) {
|
|
Binding binding{.uniform_name = "u_material.texture_diffuse",
|
|
.texture_unit = texture_unit_counter++};
|
|
base_color_texture = std::make_pair(GpuImage(material.base_color_texture.value()), binding);
|
|
}
|
|
|
|
if (material.normal_map_texture.has_value()) {
|
|
Binding binding{.uniform_name = "u_material.texture_normal",
|
|
.texture_unit = texture_unit_counter++};
|
|
normal_map_texture = std::make_pair(GpuImage(material.normal_map_texture.value()), binding);
|
|
}
|
|
}
|
|
void GpuMaterial::bind() const
|
|
{
|
|
auto bind_texture = [this](auto const &texture) {
|
|
if (texture.has_value()) {
|
|
shader->set_uniform(texture->second.uniform_name, texture->second.texture_unit);
|
|
glActiveTexture(GL_TEXTURE0 + texture->second.texture_unit);
|
|
glBindTexture(GL_TEXTURE_2D, texture->first.texture);
|
|
}
|
|
};
|
|
|
|
bind_texture(base_color_texture);
|
|
bind_texture(normal_map_texture);
|
|
}
|