Add basics of materials
[opengl.git] / material.cpp
1 #include "material.hpp"
2 #include <iostream>
3 #include <CoreGraphics/CoreGraphics.h>
4
5 Material::Material(const aiMaterial &ai, GLuint progId): progId(progId) {
6         if (ai.GetTextureCount(aiTextureType_DIFFUSE) > 0) {
7                 aiString path;
8                 ai.GetTexture(aiTextureType_DIFFUSE, 0, &path);
9                 texture = new Texture(std::string(path.C_Str()));
10         }
11         ai.Get(AI_MATKEY_SHININESS, shininess);
12         ai.Get(AI_MATKEY_COLOR_AMBIENT, ambient);
13         ai.Get(AI_MATKEY_COLOR_DIFFUSE, diffuse);
14         ai.Get(AI_MATKEY_COLOR_SPECULAR, specular);
15 }
16
17 Material::Texture::Texture(const std::string &path) {
18         auto provider = CGDataProviderCreateWithFilename(path.c_str());
19         auto ref = CGImageCreateWithJPEGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault);
20         auto dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref));
21         auto img = (unsigned char*) CFDataGetBytePtr(dataRef);
22
23         glGenTextures(1, &texId);
24         glBindTexture(GL_TEXTURE_2D, texId);
25         auto width = CGImageGetWidth(ref), height = CGImageGetHeight(ref);
26         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, img);
27         glGenerateMipmap(GL_TEXTURE_2D);
28
29         CGImageRelease(ref);
30         CFRelease(dataRef);
31 }
32
33 void Material::bind() const {
34         glUniform3f(glGetUniformLocation(progId, "material.ambient"), ambient.r, ambient.g, ambient.b);
35         glUniform3f(glGetUniformLocation(progId, "material.diffuse"), diffuse.r, diffuse.g, diffuse.b);
36         glUniform3f(glGetUniformLocation(progId, "material.specular"), specular.r, specular.g, specular.b);
37         glUniform1f(glGetUniformLocation(progId, "material.shininess"), shininess);
38         glUniform1i(glGetUniformLocation(progId, "material.hasTexture"), texture != nullptr);
39
40         if (texture) 
41                 glBindTexture(GL_TEXTURE_2D, texture->texId);
42 }