X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=material.cpp;fp=material.cpp;h=470f1a2caa370bd2292a474f2ccc34f39e9662bf;hp=0000000000000000000000000000000000000000;hb=37cba564a96018a5500e942498d4e48c0ebe73ed;hpb=ba5e08bf25de722d907748ce55b27a45b2b270bf diff --git a/material.cpp b/material.cpp new file mode 100644 index 0000000..470f1a2 --- /dev/null +++ b/material.cpp @@ -0,0 +1,42 @@ +#include "material.hpp" +#include +#include + +Material::Material(const aiMaterial &ai, GLuint progId): progId(progId) { + if (ai.GetTextureCount(aiTextureType_DIFFUSE) > 0) { + aiString path; + ai.GetTexture(aiTextureType_DIFFUSE, 0, &path); + texture = new Texture(std::string(path.C_Str())); + } + ai.Get(AI_MATKEY_SHININESS, shininess); + ai.Get(AI_MATKEY_COLOR_AMBIENT, ambient); + ai.Get(AI_MATKEY_COLOR_DIFFUSE, diffuse); + ai.Get(AI_MATKEY_COLOR_SPECULAR, specular); +} + +Material::Texture::Texture(const std::string &path) { + auto provider = CGDataProviderCreateWithFilename(path.c_str()); + auto ref = CGImageCreateWithJPEGDataProvider(provider, nullptr, false, kCGRenderingIntentDefault); + auto dataRef = CGDataProviderCopyData(CGImageGetDataProvider(ref)); + auto img = (unsigned char*) CFDataGetBytePtr(dataRef); + + glGenTextures(1, &texId); + glBindTexture(GL_TEXTURE_2D, texId); + auto width = CGImageGetWidth(ref), height = CGImageGetHeight(ref); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, img); + glGenerateMipmap(GL_TEXTURE_2D); + + CGImageRelease(ref); + CFRelease(dataRef); +} + +void Material::bind() const { + glUniform3f(glGetUniformLocation(progId, "material.ambient"), ambient.r, ambient.g, ambient.b); + glUniform3f(glGetUniformLocation(progId, "material.diffuse"), diffuse.r, diffuse.g, diffuse.b); + glUniform3f(glGetUniformLocation(progId, "material.specular"), specular.r, specular.g, specular.b); + glUniform1f(glGetUniformLocation(progId, "material.shininess"), shininess); + glUniform1i(glGetUniformLocation(progId, "material.hasTexture"), texture != nullptr); + + if (texture) + glBindTexture(GL_TEXTURE_2D, texture->texId); +}