Add extra skyboxes
[opengl.git] / material.cpp
1 #include "material.hpp"
2 #include "image.hpp"
3
4 Material::Material(const aiMaterial &ai, GLuint progId): progId(progId) {
5         aiString path;
6         ai.GetTexture(aiTextureType_DIFFUSE, 1, &path);
7         albedo = new Texture(std::string(path.C_Str()));
8         path = "";
9
10         ai.GetTexture(aiTextureType_NORMALS, 0, &path);
11         normal = new Texture(std::string(path.C_Str()));
12         path = "";
13
14         ai.GetTexture(aiTextureType_UNKNOWN, 0, &path);
15         metallicRoughness = new Texture(std::string(path.C_Str()));
16         path = "";
17         
18         ai.GetTexture(aiTextureType_LIGHTMAP, 0, &path);
19         ambientOcclusion = new Texture(std::string(path.C_Str()));
20 }
21
22 Material::Texture::Texture(const std::string &fileName) {
23         glGenTextures(1, &texId);
24         glBindTexture(GL_TEXTURE_2D, texId);
25         Image img("models/" + fileName);
26         glTexImage2D(GL_TEXTURE_2D, 0, img.internalFormat(), img.width(), img.height(), 0, img.format(), img.type(), img.data());
27         glGenerateMipmap(GL_TEXTURE_2D);
28 }
29
30 void Material::bind() const {
31         glUniform1i(glGetUniformLocation(progId, "albedoMap"), 0);
32         glActiveTexture(GL_TEXTURE0);
33         glBindTexture(GL_TEXTURE_2D, albedo->texId);
34
35         glUniform1i(glGetUniformLocation(progId, "normalMap"), 1);
36         glActiveTexture(GL_TEXTURE1);
37         glBindTexture(GL_TEXTURE_2D, normal->texId);
38
39         glUniform1i(glGetUniformLocation(progId, "metallicRoughnessMap"), 2);
40         glActiveTexture(GL_TEXTURE2);
41         glBindTexture(GL_TEXTURE_2D, metallicRoughness->texId);
42
43         glUniform1i(glGetUniformLocation(progId, "aoMap"), 3);
44         glActiveTexture(GL_TEXTURE3);
45         glBindTexture(GL_TEXTURE_2D, ambientOcclusion->texId);
46 }