/* * Copyright (C) 2018 Tomasz Kramkowski * SPDX-License-Identifier: MIT */ #include #include #include #include "ensize.h" #include "eprintf.h" #include "mtl.h" #include "tex.h" struct mtl { char name[50]; GLuint diff; GLuint spec; }; static struct mtl *mtls; static int lmtls; static size_t nmtls; GLuint tex_file(const char *name, const char *type) { char loc[100]; GLuint ret; FILE *f; snprintf(loc, sizeof loc, "assets/%s.%s.png", name, type); f = fopen(loc, "rb"); if (f == NULL) eprintf("Could not open '%s':", loc); ret = png2tex(f); fclose(f); return ret; } int mtl_load(char *name) { struct mtl *m; for (int i = 0; i < lmtls; i++) if (strcmp(mtls[i].name, name) == 0) return i; mtls = ENSIZE(mtls, lmtls + 1, &nmtls, 16); m = &mtls[lmtls]; snprintf(m->name, sizeof m->name, "%s", name); m->diff = tex_file(name, "diff"); m->spec = tex_file(name, "spec"); return lmtls++; } void mtl_use(int mtl) { assert(mtl < lmtls); // TODO: Blank textures or something if (mtl < 0) return; gl_tex_active(GL_TEXTURE0); gl_tex_bind(GL_TEXTURE_2D, mtls[mtl].diff); gl_tex_active(GL_TEXTURE1); gl_tex_bind(GL_TEXTURE_2D, mtls[mtl].spec); }