Handle loading of embedded textures
[opengl.git] / material.cpp
1 #include "material.hpp"
2 #include "image.hpp"
3
4 Material::Material(const aiMaterial &ai, const aiScene &scene, GLuint progId): progId(progId) {
5         aiString name;
6         ai.Get(AI_MATKEY_NAME, name);   
7         if (name == aiString("default material")) {
8                 abort();
9         }
10
11         aiString path;
12         ai.GetTexture(aiTextureType_DIFFUSE, 1, &path);
13         albedo = new Texture(path, scene);
14         path = "";
15
16         ai.GetTexture(aiTextureType_NORMALS, 0, &path);
17         normal = new Texture(path, scene);
18         path = "";
19
20         ai.GetTexture(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE, 0, &path);
21         metallicRoughness = new Texture(path, scene);
22         path = "";
23         
24         ai.GetTexture(aiTextureType_LIGHTMAP, 0, &path);
25         ambientOcclusion = new Texture(path, scene);
26 }
27
28 Material::Texture::Texture(const aiString fileName, const aiScene &scene) {
29         glGenTextures(1, &texId);
30         glBindTexture(GL_TEXTURE_2D, texId);
31         
32         std::string path;
33         unsigned char *data;
34         if (fileName.data[0] == '*') {
35                 // embedded
36                 int embIdx = atoi(&fileName.data[1]);
37                 aiTexture *texture = scene.mTextures[embIdx];
38                 if (texture->mHeight == 0) {
39                         Image img((unsigned char*)texture->pcData, texture->mWidth);
40                         glTexImage2D(GL_TEXTURE_2D, 0, img.internalFormat(), img.width(), img.height(), 0, img.format(), img.type(), img.data());
41                 } else {
42                         fprintf(stderr, "TODO: handle uncompressed embedded textures");
43                         abort();
44                 }
45         } else {
46                 // not embedded
47                 Image img("models/" + std::string(fileName.C_Str()));
48                 glTexImage2D(GL_TEXTURE_2D, 0, img.internalFormat(), img.width(), img.height(), 0, img.format(), img.type(), img.data());
49         }
50
51         glGenerateMipmap(GL_TEXTURE_2D);
52 }
53
54 void Material::bind() const {
55         glUniform1i(glGetUniformLocation(progId, "albedoMap"), 0);
56         glActiveTexture(GL_TEXTURE0);
57         glBindTexture(GL_TEXTURE_2D, albedo->texId);
58
59         glUniform1i(glGetUniformLocation(progId, "normalMap"), 1);
60         glActiveTexture(GL_TEXTURE1);
61         glBindTexture(GL_TEXTURE_2D, normal->texId);
62
63         glUniform1i(glGetUniformLocation(progId, "metallicRoughnessMap"), 2);
64         glActiveTexture(GL_TEXTURE2);
65         glBindTexture(GL_TEXTURE_2D, metallicRoughness->texId);
66
67         glUniform1i(glGetUniformLocation(progId, "aoMap"), 3);
68         glActiveTexture(GL_TEXTURE3);
69         glBindTexture(GL_TEXTURE_2D, ambientOcclusion->texId);
70 }