]> git.tdb.fi Git - libs/gl.git/commitdiff
Support embedding textures in datafiles
authorMikko Rasa <tdb@tdb.fi>
Sat, 12 Jan 2008 12:10:52 +0000 (12:10 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sat, 12 Jan 2008 12:10:52 +0000 (12:10 +0000)
source/ilwrap.cpp
source/ilwrap.h
source/texture.cpp
source/texture.h
source/texture2d.cpp
source/texture2d.h
source/texture3d.cpp

index be8442bee741a325199a4f45865a86bbbcea549c..a1ae1631776539ec5d2be163af3e8f86ced48549 100644 (file)
@@ -9,11 +9,15 @@ Distributed under the LGPL
 #include <msp/core/except.h>
 #include "ilwrap.h"
 
+using namespace std;
+
 namespace Msp {
 namespace GL {
 
 Image::Image()
 {
+       static bool init_done=false;
+
        if(!init_done)
        {
                ilInit();
@@ -30,13 +34,20 @@ Image::~Image()
        ilDeleteImages(1, &id);
 }
 
-void Image::load(const std::string &fn)
+void Image::load_file(const string &fn)
 {
        ilBindImage(id);
        if(!ilLoadImage(const_cast<char *>(fn.c_str())))
                throw Exception("Error loading image "+fn);
 }
 
+void Image::load_lump(const void *data, unsigned size)
+{
+       ilBindImage(id);
+       if(!ilLoadL(IL_TYPE_UNKNOWN, const_cast<void *>(data), size))
+               throw Exception("Error loading image from lump");
+}
+
 PixelFormat Image::get_format() const
 {
        switch(ilGetInteger(IL_IMAGE_FORMAT))
@@ -67,7 +78,5 @@ const void *Image::get_data() const
        return ilGetData();
 }
 
-bool Image::init_done=false;
-
 } // namespace GL
 } // namespace Msp
index 7b3766a4c4f347b4dda5bbde92700216b5b8c963..331cfd32a2b625db1cb5d35cd8943a1c4277a771 100644 (file)
@@ -18,13 +18,12 @@ class Image
 private:
        unsigned id;
 
-       static bool init_done;
-
 public:
        Image();
        ~Image();
 
-       void load(const std::string &);
+       void load_file(const std::string &);
+       void load_lump(const void *, unsigned);
        PixelFormat get_format() const;
        unsigned get_width() const;
        unsigned get_height() const;
index 1cb169450fbde2bdb090fa2adadcf562a4148f02..7ce039acb6df2278ff8c2df8c289e63cfd290820 100644 (file)
@@ -9,9 +9,35 @@ Distributed under the LGPL
 #include "texture.h"
 #include "texunit.h"
 
+using namespace std;
+
 namespace Msp {
 namespace GL {
 
+istream &operator>>(istream &in, TextureFilter &tf)
+{
+       string str;
+       in>>str;
+
+       if(str=="NEAREST")
+               tf=NEAREST;
+       else if(str=="LINEAR")
+               tf=LINEAR;
+       else if(str=="NEAREST_MIPMAP_NEAREST")
+               tf=NEAREST_MIPMAP_NEAREST;
+       else if(str=="NEAREST_MIPMAP_LINEAR")
+               tf=NEAREST_MIPMAP_LINEAR;
+       else if(str=="LINEAR_MIPMAP_NEAREST")
+               tf=LINEAR_MIPMAP_NEAREST;
+       else if(str=="LINEAR_MIPMAP_LINEAR")
+               tf=LINEAR_MIPMAP_LINEAR;
+       else
+               in.setstate(ios_base::failbit);
+
+       return in;
+}
+
+
 void Texture::bind() const
 {
        if(!target)
@@ -68,5 +94,29 @@ void Texture::maybe_bind() const
                bind();
 }
 
+
+Texture::Loader::Loader(Texture &t):
+       tex(t)
+{
+       add("min_filter", &Loader::min_filter);
+       add("mag_filter", &Loader::mag_filter);
+       add("generate_mipmap", &Loader::generate_mipmap);
+}
+
+void Texture::Loader::min_filter(TextureFilter f)
+{
+       tex.set_min_filter(f);
+}
+
+void Texture::Loader::mag_filter(TextureFilter f)
+{
+       tex.set_mag_filter(f);
+}
+
+void Texture::Loader::generate_mipmap(bool gm)
+{
+       tex.parameter(GL_GENERATE_MIPMAP_SGIS, gm);
+}
+
 } // namespace GL
 } // namespace Msp
index 28f9cb328979efdcefc0c6934e250da56748cdb7..6dd729b4d23a546f0c50bc92a4aa2cb73291652d 100644 (file)
@@ -8,6 +8,8 @@ Distributed under the LGPL
 #ifndef MSP_GL_TEXTURE_H_
 #define MSP_GL_TEXTURE_H_
 
+#include <istream>
+#include <msp/datafile/loader.h>
 #include "gl.h"
 #include "types.h"
 
@@ -24,6 +26,9 @@ enum TextureFilter
        LINEAR_MIPMAP_LINEAR   = GL_LINEAR_MIPMAP_LINEAR
 };
 
+std::istream &operator>>(std::istream &, TextureFilter &);
+
+
 /**
 Base class for textures.  This class only defines operations common for all
 texture types and is not instantiable.  For specifying images for textures, see
@@ -31,6 +36,19 @@ one of the dimensioned texture classes.
 */
 class Texture
 {
+protected:
+       class Loader: public DataFile::Loader
+       {
+       protected:
+               Texture &tex;
+
+       public:
+               Loader(Texture &);
+               void min_filter(TextureFilter);
+               void mag_filter(TextureFilter);
+               void generate_mipmap(bool);
+       };
+
 public:
        ~Texture();
 
index 455c7314cb4d2a04676b1ac6e6612884e95ef212..fbf86a43b77fe79dc2f81120a98b516aeea05b85 100644 (file)
@@ -11,8 +11,6 @@ Distributed under the LGPL
 
 using namespace std;
 
-#include <iostream>
-
 namespace Msp {
 namespace GL {
 
@@ -60,8 +58,13 @@ void Texture2D::sub_image(int level, int x, int y, sizei wd, sizei ht, PixelForm
 void Texture2D::load_image(const string &fn)
 {
        Image img;
-       img.load(fn);
+       img.load_file(fn);
+
+       image(img);
+}
 
+void Texture2D::image(const Image &img)
+{
        unsigned w=img.get_width();
        unsigned h=img.get_height();
        PixelFormat fmt=img.get_format();
@@ -73,5 +76,20 @@ void Texture2D::load_image(const string &fn)
        image(0, fmt, GL_UNSIGNED_BYTE, img.get_data());
 }
 
+
+Texture2D::Loader::Loader(Texture2D &t):
+       Texture::Loader(t)
+{
+       add("image_data", &Loader::image_data);
+}
+
+void Texture2D::Loader::image_data(const string &data)
+{
+       Image img;
+       img.load_lump(data.data(), data.size());
+
+       static_cast<Texture2D &>(tex).image(img);
+}
+
 } // namespace GL
 } // namespace Msp
index 251561b99490c5ca93166bd9679e121a3fbc92d2..b62466cb0a75bc524cf11a484567bfe17eb02625 100644 (file)
@@ -9,17 +9,29 @@ Distributed under the LGPL
 #define MSP_GL_TEXTURE2D_H_
 
 #include <string>
+#include <msp/datafile/loader.h>
 #include "pixelformat.h"
 #include "texture.h"
 
 namespace Msp {
 namespace GL {
 
+class Image;
+
 /**
 Two-dimensional texture class.  This is the most common type of texture.
 */
 class Texture2D: public Texture
 {
+public:
+       class Loader: public Texture::Loader
+       {
+       public:
+               Loader(Texture2D &);
+       private:
+               void image_data(const std::string &);
+       };
+
 private:
        PixelFormat ifmt;
        sizei width;
@@ -56,6 +68,9 @@ public:
 
        sizei get_width() const  { return width; }
        sizei get_height() const { return height; }
+
+private:
+       void image(const Image &);
 };
 
 } // namespace GL
index 17adb6a109369ed6ca3053d43ee740f851cd6cb6..c38b44652d366c4c13fa9cd18bf3928de8da9080 100644 (file)
@@ -53,7 +53,7 @@ void Texture3D::image(int level, PixelFormat fmt, GLenum type, const void *data)
 void Texture3D::load_image(const string &fn, int dp)
 {
        Image img;
-       img.load(fn);
+       img.load_file(fn);
 
        unsigned w=img.get_width();
        unsigned h=img.get_height();