summaryrefslogtreecommitdiffstats
path: root/src/video/load_texture.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/video/load_texture.c')
-rw-r--r--src/video/load_texture.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/video/load_texture.c b/src/video/load_texture.c
new file mode 100644
index 0000000..8d02b67
--- /dev/null
+++ b/src/video/load_texture.c
@@ -0,0 +1,77 @@
+#include "video/video.h"
+#include "filesystem/path.h"
+
+#include "Nebu_scripting.h"
+
+void freeTextureData(texture *tex) {
+ free(tex->data);
+ free(tex);
+}
+
+texture* loadTextureData(const char *filename) {
+ texture *tex = NULL;
+ char *path;
+ char *artpack;
+
+ scripting_GetGlobal("settings", "current_artpack", NULL);
+ scripting_GetStringResult(&artpack);
+ path = getArtPath(artpack, filename);
+ free(artpack);
+ if(path != NULL) {
+ tex = LOAD_TEX(path);
+ free(path);
+ }
+
+ if(tex == NULL) {
+ fprintf(stderr, "fatal: failed load %s, exiting...\n", filename);
+ exit(1); /* OK: critical, installation corrupt */
+ }
+ return tex;
+}
+
+void loadTexture(const char *filename, int format) {
+ texture *tex;
+ GLint internal;
+ int maxSize;
+
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
+
+ tex = loadTextureData(filename);
+ if(tex->channels == 3) internal = GL_RGB;
+ else internal = GL_RGBA;
+ if(format == GL_DONT_CARE) {
+ if(tex->channels == 3) format = GL_RGB;
+ if(tex->channels == 4) format = GL_RGBA;
+ }
+ /* TODO: build mipmaps the proper way, box filters suck */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ {
+ texture *newtex;
+ int level = 0;
+ while (tex->width > 1 || tex->height > 1) {
+ if(tex->width <= maxSize && tex->height <= maxSize) {
+ glTexImage2D(GL_TEXTURE_2D, level, format,
+ tex->width, tex->height,
+ 0, internal, GL_UNSIGNED_BYTE, tex->data);
+#ifdef PRINTF_VERBOSE
+ printf("uploading level %d, %dx%d texture\n",
+ level, tex->width, tex->height);
+#endif
+ level++;
+ }
+ newtex = mipmap_png_texture(tex, 1, 0, 0);
+ freeTextureData(tex);
+ tex = newtex;
+ }
+ /* upload 1x1 mip level */
+ glTexImage2D(GL_TEXTURE_2D, level, format,
+ tex->width, tex->height,
+ 0, internal, GL_UNSIGNED_BYTE, tex->data);
+#ifdef PRINTF_VERBOSE
+ printf("uploading level %d, %dx%d texture\n",
+ level, tex->width, tex->height);
+#endif
+ freeTextureData(tex);
+ }
+}