Skybox
[opengl.git] / material.cpp
1 #include "material.hpp"
2 #include "image.hpp"
3
4 Material::Material(const aiMaterial &ai, GLuint progId): progId(progId) {
5         if (ai.GetTextureCount(aiTextureType_DIFFUSE) > 0) {
6                 aiString path;
7                 ai.GetTexture(aiTextureType_DIFFUSE, 0, &path);
8                 diffuseMap = new Texture(std::string(path.C_Str()));
9         }
10         if (ai.GetTextureCount(aiTextureType_SPECULAR) > 0) {
11                 aiString path;
12                 ai.GetTexture(aiTextureType_SPECULAR, 0, &path);
13                 specularMap = new Texture(std::string(path.C_Str()));
14         }
15         if (ai.GetTextureCount(aiTextureType_NORMALS) > 0) {
16                 aiString path;
17                 ai.GetTexture(aiTextureType_NORMALS, 0, &path);
18                 normalMap = new Texture(std::string(path.C_Str()));
19         }
20         ai.Get(AI_MATKEY_SHININESS, shininess);
21         ai.Get(AI_MATKEY_COLOR_AMBIENT, ambient);
22         ai.Get(AI_MATKEY_COLOR_DIFFUSE, diffuse);
23         ai.Get(AI_MATKEY_COLOR_SPECULAR, specular);
24 }
25
26 Material::Texture::Texture(const std::string &fileName) {
27         glGenTextures(1, &texId);
28         glBindTexture(GL_TEXTURE_2D, texId);
29         Image img("models/" + fileName);
30         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width(), img.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.data());
31         glGenerateMipmap(GL_TEXTURE_2D);
32 }
33
34 void Material::bind() const {
35         glUniform4f(glGetUniformLocation(progId, "material.ambient"), ambient.r, ambient.g, ambient.b, ambient.a);
36         glUniform4f(glGetUniformLocation(progId, "material.diffuse"), diffuse.r, diffuse.g, diffuse.b, diffuse.a);
37         glUniform4f(glGetUniformLocation(progId, "material.specular"), specular.r, specular.g, specular.b, specular.a);
38         glUniform1f(glGetUniformLocation(progId, "material.shininess"), shininess);
39         glUniform1i(glGetUniformLocation(progId, "material.hasTexture"), diffuseMap != nullptr);
40         glUniform1i(glGetUniformLocation(progId, "material.hasSpecularMap"), specularMap != nullptr);
41         glUniform1i(glGetUniformLocation(progId, "material.hasNormalMap"), normalMap != nullptr);
42
43         if (diffuseMap) {
44                 glUniform1i(glGetUniformLocation(progId, "material.diffuseMap"), 0);
45                 glActiveTexture(GL_TEXTURE0);
46                 glBindTexture(GL_TEXTURE_2D, diffuseMap->texId);
47         }
48         if (specularMap) {
49                 glUniform1i(glGetUniformLocation(progId, "material.specularMap"), 1);
50                 glActiveTexture(GL_TEXTURE1);
51                 glBindTexture(GL_TEXTURE_2D, specularMap->texId);
52         }
53         if (normalMap) {
54                 glUniform1i(glGetUniformLocation(progId, "material.normalMap"), 2);
55                 glActiveTexture(GL_TEXTURE2);
56                 glBindTexture(GL_TEXTURE_2D, normalMap->texId);
57         }
58 }