]> git.tdb.fi Git - libs/gl.git/commitdiff
Move the whole-texture image call and raw data loading to base class
authorMikko Rasa <tdb@tdb.fi>
Mon, 1 Nov 2021 12:42:49 +0000 (14:42 +0200)
committerMikko Rasa <tdb@tdb.fi>
Mon, 1 Nov 2021 18:00:58 +0000 (20:00 +0200)
This reduces duplication in the loading code and promotes uniform
behaviour across the different texture classes.

12 files changed:
source/core/texture.cpp
source/core/texture.h
source/core/texture1d.cpp
source/core/texture1d.h
source/core/texture2d.cpp
source/core/texture2d.h
source/core/texture2dmultisample.cpp
source/core/texture2dmultisample.h
source/core/texture3d.cpp
source/core/texture3d.h
source/core/texturecube.cpp
source/core/texturecube.h

index 78053386a1e15e80ca2414d1d6261e19e4ac73ca..175e76a2365688c8aef1f30592759d8addbefab1 100644 (file)
@@ -92,6 +92,7 @@ Texture::Loader::Loader(Texture &t, Collection *c):
        add("generate_mipmap", &Loader::generate_mipmap);
        add("image_data", &Loader::image_data);
        add("mipmap_levels", &Loader::mipmap_levels);
+       add("raw_data", &Loader::raw_data);
 }
 
 void Texture::Loader::finish()
@@ -143,5 +144,13 @@ void Texture::Loader::mipmap_levels(unsigned l)
        levels = l;
 }
 
+void Texture::Loader::raw_data(const string &data)
+{
+       if(obj.manager)
+               obj.set_manager(0);
+
+       obj.image(0, data.data());
+}
+
 } // namespace GL
 } // namespace Msp
index ff56e85cb233d97ff5b822c5360255b7c9e2a8bc..8db5dad83e0a90e6aa1bcde5a641f487a5e88355 100644 (file)
@@ -53,6 +53,7 @@ protected:
                void generate_mipmap(bool);
                void image_data(const std::string &);
                void mipmap_levels(unsigned);
+               void raw_data(const std::string &);
        };
 
 public:
@@ -91,6 +92,11 @@ public:
 
        using TextureBackend::generate_mipmap;
 
+       /** Replaces contents of an entire mipmap level.  Allocated storage must
+       exist.  The image data is interpreted according to the storage format and
+       must have size matching the selected mipmap level. */
+       virtual void image(unsigned level, const void *) = 0;
+
        /** Loads an image into the texture from a file. */
        virtual void load_image(const std::string &, unsigned = 0);
 
index ae4347e334d8d99ee2c07d503a264528c4eb463b..7d357ff29c3efaa05806886d5f3da4b053fa5075 100644 (file)
@@ -82,16 +82,10 @@ Texture1D::Loader::Loader(Texture1D &t, Collection &c):
 
 void Texture1D::Loader::init()
 {
-       add("raw_data", &Loader::raw_data);
        add("storage", &Loader::storage);
        add("storage", &Loader::storage_levels);
 }
 
-void Texture1D::Loader::raw_data(const string &data)
-{
-       obj.image(0, data.data());
-}
-
 void Texture1D::Loader::storage(PixelFormat fmt, unsigned w)
 {
        obj.storage(fmt, w);
index f99d3ef0713daa64be029a59b9d2d2a0a30a87e9..efd0517d628dc168c45f1b506a2133c673dcbcec 100644 (file)
@@ -23,7 +23,6 @@ public:
        private:
                void init();
 
-               void raw_data(const std::string &);
                void storage(PixelFormat, unsigned);
                void storage_levels(PixelFormat, unsigned, unsigned);
        };
@@ -38,10 +37,7 @@ public:
        cannot be changed once set. */
        void storage(PixelFormat, unsigned wd, unsigned lv = 0);
 
-       /** Replaces contents of an entire mipmap level.  Allocated storage must
-       exist.  The image data is interpreted according to the storage format and
-       must have size matching the selected mipmap level. */
-       void image(unsigned level, const void *);
+       virtual void image(unsigned level, const void *);
 
        /** Replaces a range of texels in the texture.  Allocated storage must
        exist.  The image data is interpreted according to the storage format and
index 41f4ab11280259f1fd68f621c8f82ee289f9dbed..9b1c16ea120dbe6fe7d88c96f57dcfbfd386e79e 100644 (file)
@@ -99,18 +99,10 @@ Texture2D::Loader::Loader(Texture2D &t, Collection &c):
 
 void Texture2D::Loader::init()
 {
-       add("raw_data", &Loader::raw_data);
        add("storage", &Loader::storage);
        add("storage", &Loader::storage_levels);
 }
 
-void Texture2D::Loader::raw_data(const string &data)
-{
-       if(obj.manager)
-               obj.set_manager(0);
-       obj.image(0, data.data());
-}
-
 void Texture2D::Loader::storage(PixelFormat fmt, unsigned w, unsigned h)
 {
        obj.storage(fmt, w, h);
index 1c750bd1e87d301aed2f79799688e410ef1793bd..61a3f29f035c99b31dc5fc48cceff853ec3fbab8 100644 (file)
@@ -24,7 +24,6 @@ public:
        private:
                void init();
 
-               void raw_data(const std::string &);
                void storage(PixelFormat, unsigned, unsigned);
                void storage_levels(PixelFormat, unsigned, unsigned, unsigned);
        };
@@ -42,10 +41,7 @@ public:
        cannot be changed once set. */
        void storage(PixelFormat, unsigned wd, unsigned ht, unsigned lv = 0);
 
-       /** Replaces contents of an entire mipmap level.  Allocated storage must
-       exist.  The image data is interpreted according to the storage format and
-       must have size matching the selected mipmap level. */
-       virtual void image(unsigned level, const void *);
+       void image(unsigned level, const void *) override;
 
        /** Replaces a rectangular region of the texture.  Allocated storage must
        exist.  The image data is interpreted according to the storage format and
index 1c0106d7dda094396e52104d5d0989bf9a14ed8b..ce35bdb795afb5487c226856eabf94b9f945d316 100644 (file)
@@ -28,6 +28,11 @@ void Texture2DMultisample::storage(PixelFormat fmt, unsigned wd, unsigned ht, un
        allocate();
 }
 
+void Texture2DMultisample::image(unsigned, const void *)
+{
+       throw invalid_operation("Texture2DMultisample::image");
+}
+
 void Texture2DMultisample::image(const Graphics::Image &, unsigned)
 {
        throw invalid_operation("Texture2DMultisample::image");
index 82ab0818d84fc4d2994458dd8688d1b1b4ad8d9a..20c0f864b531311563353afc8fa2e9417f022c97 100644 (file)
@@ -29,6 +29,7 @@ public:
        for the texture. */
        void storage(PixelFormat, unsigned wd, unsigned ht, unsigned sm);
 
+       virtual void image(unsigned, const void *);
        virtual void image(const Graphics::Image &, unsigned = 0);
 
        unsigned get_width() const { return width; }
index 0125dd0930a16a8a5dbc6cb5fe3c025cfdaddab9..c901556aa52f7aa2b84357f3ce784bf3d440279c 100644 (file)
@@ -111,16 +111,10 @@ Texture3D::Loader::Loader(Texture3D &t, Collection &c):
 
 void Texture3D::Loader::init()
 {
-       add("raw_data", &Loader::raw_data);
        add("storage", &Loader::storage);
        add("storage", &Loader::storage_levels);
 }
 
-void Texture3D::Loader::raw_data(const string &data)
-{
-       obj.image(0, data.data());
-}
-
 void Texture3D::Loader::storage(PixelFormat fmt, unsigned w, unsigned h, unsigned d)
 {
        obj.storage(fmt, w, h, d);
index 1fbcf4ee43044436a38cfdef6a2786762edd1ed6..c1bf8ed88bda2201b7ed3805435817227ac097b1 100644 (file)
@@ -24,7 +24,6 @@ public:
        private:
                void init();
 
-               void raw_data(const std::string &);
                void storage(PixelFormat, unsigned, unsigned, unsigned);
                void storage_levels(PixelFormat, unsigned, unsigned, unsigned, unsigned);
        };
index ff2b28755bb3e8e37c3dbadf57f6695b24e13d83..0e0a1fc9178dca4ebd8b4cfc55bd52185b5e5b51 100644 (file)
@@ -49,6 +49,14 @@ void TextureCube::storage(PixelFormat fmt, unsigned sz, unsigned lv)
        allocate();
 }
 
+void TextureCube::image(unsigned level, const void *data)
+{
+       const char *pixels = static_cast<const char *>(data);
+       unsigned face_size = size*size*get_pixel_size(storage_fmt);
+       for(unsigned i=0; i<6; ++i)
+               image(static_cast<TextureCubeFace>(i), level, pixels+i*face_size);
+}
+
 void TextureCube::image(TextureCubeFace face, unsigned level, const void *data)
 {
        unsigned lsz = get_level_size(level);
@@ -90,10 +98,7 @@ void TextureCube::image(const Graphics::Image &img, unsigned lv)
        else if(w!=size || h!=size)
                throw incompatible_data("TextureCube::image");
 
-       const char *pixels = reinterpret_cast<const char *>(img.get_pixels());
-       unsigned face_size = img.get_stride()*size;
-       for(unsigned i=0; i<6; ++i)
-               image(static_cast<TextureCubeFace>(i), 0, pixels+i*face_size);
+       image(0, img.get_pixels());
 }
 
 unsigned TextureCube::get_n_levels() const
index 0f753c757c54b85c421aade5d6b199137bae9141..eef377e34105742236e18e484d68f829825f27b6 100644 (file)
@@ -60,6 +60,8 @@ public:
        cannot be changed once set. */
        void storage(PixelFormat, unsigned size, unsigned lv = 0);
 
+       virtual void image(unsigned, const void *);
+
        /** Replaces contents of a single face.  Allocated storage must exist.  The
        image data is interpreted according to the storage format and must have size
        matching the selected mipmap level. */