diff --git a/src/kekengine/cpp/mesh.cpp b/src/kekengine/cpp/mesh.cpp index e338c49..4f3b6a9 100644 --- a/src/kekengine/cpp/mesh.cpp +++ b/src/kekengine/cpp/mesh.cpp @@ -63,24 +63,25 @@ Mesh::~Mesh() { delete material; } +static void bindTextureUniform(Shader *shader, std::string name, std::shared_ptr texture, GLuint *textureIndex) { + GLint loc = glGetUniformLocation(shader->id, name.c_str()); + if(loc != -1) { + texture->use(*textureIndex); + glUniform1i(loc, *textureIndex - GL_TEXTURE0); + (*textureIndex)++; + } +} + void Mesh::draw(Shader *shader) { glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); - GLint ambient = glGetUniformLocation(shader->id, "material.ambient"); - // FIXME: is -1 - if(ambient != -1) { // Material can be passed to shader - material->ambient->use(GL_TEXTURE0); - glUniform1i(ambient, 0); - material->diffuse->use(GL_TEXTURE1); - glUniform1i(glGetUniformLocation(shader->id, "material.diffuse"), 1); - material->specular->use(GL_TEXTURE2); - glUniform1i(glGetUniformLocation(shader->id, "material.specular"), 2); - glUniform1f(glGetUniformLocation(shader->id, "material.shininess"), material->shininess); - }else { - std::cerr << "oof" << std::endl; - } + GLuint textureIndex = GL_TEXTURE0; + bindTextureUniform(shader, "material.ambient", material->ambient, &textureIndex); + bindTextureUniform(shader, "material.diffuse", material->diffuse, &textureIndex); + bindTextureUniform(shader, "material.specular", material->specular, &textureIndex); + glUniform1f(glGetUniformLocation(shader->id, "material.shininess"), material->shininess); // Bind vertices + texture coordinates glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0); diff --git a/src/kekengine/cpp/objparser.cpp b/src/kekengine/cpp/objparser.cpp index 84e9009..b024a16 100644 --- a/src/kekengine/cpp/objparser.cpp +++ b/src/kekengine/cpp/objparser.cpp @@ -108,14 +108,21 @@ Mesh *parseMesh(MemoryBuffer *buf, std::string folderPath) { } Mesh *loadMesh(std::string path) { - std::size_t n = path.find('/'); - std::string folderPath = n == std::string::npos ? "" : path.substr(n + 1); + std::size_t n = path.find_last_of('/'); + std::string folderPath = n == std::string::npos ? "" : path.substr(0, n + 1); MemoryBuffer *buf = Resource::loadResource(path); Mesh *mesh = parseMesh(buf, folderPath); delete buf; return mesh; } +static Material *makeMaterial(std::shared_ptr ambient, std::shared_ptr diffuse, std::shared_ptr specular, float shininess) { + if(!ambient) ambient = Texture::generateColor(glm::vec3(1.0f)); + if(!diffuse) diffuse = Texture::generateColor(glm::vec3(1.0f)); + if(!specular) specular = Texture::generateColor(glm::vec3(1.0f)); + return new Material(ambient, diffuse, specular, shininess); +} + std::map parseMaterials(MemoryBuffer *buf, std::string folderPath) { std::map mats; @@ -136,10 +143,7 @@ std::map parseMaterials(MemoryBuffer *buf, std::string if(cmd == "#") continue; if(cmd == "newmtl") { - if(name.length() > 0) { - Material *mat = new Material(ambient, diffuse, specular, shininess); - mats.emplace(name, mat); - } + if(name.length() > 0) mats.emplace(name, makeMaterial(ambient, diffuse, specular, shininess)); str >> name; }else if(cmd == "Ka") { @@ -163,17 +167,14 @@ std::map parseMaterials(MemoryBuffer *buf, std::string } } - if(name.length() > 0) { - Material *mat = new Material(ambient, diffuse, specular, shininess); - mats.emplace(name, mat); - } + if(name.length() > 0) mats.emplace(name, makeMaterial(ambient, diffuse, specular, shininess)); return mats; } std::map loadMaterials(std::string path) { - std::size_t n = path.find('/'); - std::string folderPath = n == std::string::npos ? "" : path.substr(n + 1); + std::size_t n = path.find_last_of('/'); + std::string folderPath = n == std::string::npos ? "" : path.substr(0, n + 1); MemoryBuffer *buf = Resource::loadResource(path); std::map mats = parseMaterials(buf, folderPath); delete buf; diff --git a/src/kekengine/cpp/texture.cpp b/src/kekengine/cpp/texture.cpp index b05ae5e..2c49065 100644 --- a/src/kekengine/cpp/texture.cpp +++ b/src/kekengine/cpp/texture.cpp @@ -8,7 +8,7 @@ namespace kek { -static unsigned int allocTexture(unsigned char *data, int width, int height, float borderColor[4]) { +static GLuint allocTexture(unsigned char *data, int width, int height, float borderColor[4]) { GLuint id; glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); @@ -37,7 +37,7 @@ Texture::Texture(std::string texturePath) { delete buf; float borderColor[] = { 1.0f, 0.0f, 1.0f, 1.0f }; - allocTexture(data, width, height, borderColor); + id = allocTexture(data, width, height, borderColor); stbi_image_free(data); } diff --git a/src/kekgame/cpp/kekgame.cpp b/src/kekgame/cpp/kekgame.cpp index ebc21f3..a49d3bb 100644 --- a/src/kekgame/cpp/kekgame.cpp +++ b/src/kekgame/cpp/kekgame.cpp @@ -19,19 +19,13 @@ int main(int argc, char **argv) { Scene *scene = new Scene(); scene->addObject(test); - MemoryBuffer *buf2 = Resource::loadResource("object/cube_colored/Cube.obj"); - Mesh *mesh2 = ObjParser::parseMesh(buf2, "object/cube_colored/"); - delete buf2; - for(int i = 0; i < 1; i++) { GameObject *test2 = new GameObject(); - test2->addMesh(new Mesh(mesh2->vertices, mesh2->indices, mesh2->material)); + test2->addMesh(ObjParser::loadMesh("object/cube_colored/Cube.obj")); test2->moveTo(glm::vec3(0.0f, 5.0f, 3 * i)); scene->addObject(test2); } - delete mesh2; - Engine::setActiveScene(scene); Engine::start();