summaryrefslogtreecommitdiff
path: root/lib/gltexture.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gltexture.cc')
-rw-r--r--lib/gltexture.cc85
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/gltexture.cc b/lib/gltexture.cc
new file mode 100644
index 0000000..7949cb9
--- /dev/null
+++ b/lib/gltexture.cc
@@ -0,0 +1,85 @@
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include "gltexture.h"
+#include "General.h"
+
+mogltk::texture::texture(int w, int h, bool plane) throw (GeneralException) : width(w), height(h), planar(plane) {
+ if ((BITCOUNT(w) != 1) || (BITCOUNT(h) != 1))
+ throw GeneralException("Size of the texture not a power of 2!");
+
+ if (!(surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32,
+#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+ 0xff000000,
+ 0x00ff0000,
+ 0x0000ff00,
+ 0x000000ff
+#else
+ 0x000000ff,
+ 0x0000ff00,
+ 0x00ff0000,
+ 0xff000000
+#endif
+ ))) {
+ throw GeneralException("Can't create RGB Surface");
+ }
+}
+
+mogltk::texture::~texture() {
+ if (surface) {
+ SDL_FreeSurface(surface);
+ } else {
+ glDeleteTextures(1, &tex);
+ }
+}
+
+SDL_Surface * mogltk::texture::GetSurface() throw (GeneralException) {
+ if (!surface)
+ throw GeneralException("Texture already generated");
+ return surface;
+}
+
+void mogltk::texture::Generate() throw (GeneralException) {
+ if (!surface)
+ throw GeneralException("Texture already generated");
+
+ if (planar) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
+ } else {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
+// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels);
+ }
+
+ SDL_FreeSurface(surface);
+ surface = 0;
+}
+
+void mogltk::texture::Bind(bool expand) throw (GeneralException) {
+ if (surface)
+ throw GeneralException("Texture is not yet generated");
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ if (expand) {
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glScaled(1 / (double) width, 1 / (double) height, 1);
+ glMatrixMode(GL_MODELVIEW);
+ }
+}
+
+GLuint mogltk::texture::GetWidth() {
+ return width;
+}
+
+GLuint mogltk::texture::GetHeight() {
+ return height;
+}
+
+void mogltk::texture::Unbind(void) {
+ glDisable(GL_TEXTURE_2D);
+}