]> git.tdb.fi Git - libs/gl.git/commitdiff
Move Batch members around
authorMikko Rasa <tdb@tdb.fi>
Thu, 30 Aug 2012 19:35:55 +0000 (22:35 +0300)
committerMikko Rasa <tdb@tdb.fi>
Thu, 30 Aug 2012 19:35:55 +0000 (22:35 +0300)
The helper functions for changing data type don't really need to be
members, so put them in a private namespace.  Other functions rearranged
in a more sensible way.

source/batch.cpp
source/batch.h

index afb9787b4d7f8bd7f34c0491120f668efc3c163b..1d9b1d4cd4ab7081a3bf95522056f61b91375217 100644 (file)
@@ -8,6 +8,44 @@
 
 using namespace std;
 
+namespace {
+
+template<typename T>
+void append(vector<unsigned char> &data, T i)
+{
+       data.insert(data.end(), sizeof(T), 0);
+       *(T *)(&data[data.size()-sizeof(T)]) = i;
+}
+
+template<typename T, typename U>
+U convert(T n)
+{
+       if(!static_cast<T>(~n))
+               return ~0;
+       else
+               return n;
+}
+
+template<typename T, typename U>
+void expand(vector<unsigned char> &data)
+{
+       unsigned count = data.size()/sizeof(T);
+       data.resize(count*sizeof(U));
+       for(unsigned i=count; i--;)
+               *(U *)(&data[i*sizeof(U)]) = convert<T, U>(*(T *)(&data[i*sizeof(T)]));
+}
+
+template<typename T, typename U>
+void shrink(vector<unsigned char> &data)
+{
+       unsigned count = data.size()/sizeof(T);
+       for(unsigned i=0; i<count; ++i)
+               *(U *)(&data[i*sizeof(U)]) = convert<T, U>(*(T *)(&data[i*sizeof(T)]));
+       data.resize(count*sizeof(U));
+}
+
+}
+
 namespace Msp {
 namespace GL {
 
@@ -45,17 +83,17 @@ void Batch::set_data_type(DataType t)
                throw invalid_operation("Batch::set_data_type");
 
        if(data_type==UNSIGNED_BYTE && t==UNSIGNED_SHORT)
-               expand_data<unsigned char, unsigned short>();
+               expand<unsigned char, unsigned short>(data);
        else if(data_type==UNSIGNED_BYTE && t==UNSIGNED_INT)
-               expand_data<unsigned char, unsigned>();
+               expand<unsigned char, unsigned>(data);
        else if(data_type==UNSIGNED_SHORT && t==UNSIGNED_INT)
-               expand_data<unsigned short, unsigned>();
+               expand<unsigned short, unsigned>(data);
        else if(data_type==UNSIGNED_INT && t==UNSIGNED_BYTE)
-               shrink_data<unsigned, unsigned char>();
+               shrink<unsigned, unsigned char>(data);
        else if(data_type==UNSIGNED_INT && t==UNSIGNED_SHORT)
-               shrink_data<unsigned, unsigned short>();
+               shrink<unsigned, unsigned short>(data);
        else if(data_type==UNSIGNED_SHORT && t==UNSIGNED_BYTE)
-               shrink_data<unsigned short, unsigned char>();
+               shrink<unsigned short, unsigned char>(data);
 
        data_type = t;
        update_ibuf_offsets();
@@ -87,6 +125,28 @@ void Batch::use_index_buffer(Buffer *buf, Batch *prev)
        dirty = true;
 }
 
+void Batch::unlink_from_ibuf()
+{
+       if(next_in_ibuf)
+               next_in_ibuf->prev_in_ibuf = prev_in_ibuf;
+       if(prev_in_ibuf)
+       {
+               prev_in_ibuf->next_in_ibuf = next_in_ibuf;
+               prev_in_ibuf->update_ibuf_offsets();
+       }
+       else if(next_in_ibuf)
+       {
+               next_in_ibuf->ibuf_offset = 0;
+               next_in_ibuf->update_ibuf_offsets();
+       }
+}
+
+void Batch::update_ibuf_offsets()
+{
+       for(Batch *b=this; b->next_in_ibuf; b=b->next_in_ibuf)
+               b->next_in_ibuf->ibuf_offset = b->ibuf_offset+b->data.size();
+}
+
 Batch &Batch::append(unsigned i)
 {
        if(data.empty())
@@ -103,9 +163,9 @@ Batch &Batch::append(unsigned i)
                set_data_type(UNSIGNED_SHORT);
 
        if(data_type==UNSIGNED_SHORT)
-               append_index<unsigned short>(i);
+               ::append<unsigned short>(data, i);
        else if(data_type==UNSIGNED_INT)
-               append_index<unsigned>(i);
+               ::append<unsigned>(data, i);
        else
                data.push_back(i);
        
@@ -173,9 +233,9 @@ void Batch::append(const Batch &other)
        {
                restart = true;
                if(data_type==UNSIGNED_SHORT)
-                       append_index<unsigned short>(0xFFFF);
+                       ::append<unsigned short>(data, 0xFFFF);
                else if(data_type==UNSIGNED_INT)
-                       append_index<unsigned>(0xFFFFFFFF);
+                       ::append<unsigned>(data, 0xFFFFFFFF);
                else
                        data.push_back(0xFF);
        }
@@ -199,6 +259,25 @@ void Batch::append(const Batch &other)
                append(other.get_index(i));
 }
 
+unsigned Batch::get_index_size() const
+{
+       if(data_type==UNSIGNED_SHORT)
+               return sizeof(unsigned short);
+       else if(data_type==UNSIGNED_INT)
+               return sizeof(unsigned);
+       return sizeof(unsigned char);
+}
+
+unsigned Batch::get_index(unsigned i) const
+{
+       if(data_type==UNSIGNED_SHORT)
+               return *(unsigned short *)&data[i*sizeof(unsigned short)];
+       else if(data_type==UNSIGNED_INT)
+               return *(unsigned *)&data[i*sizeof(unsigned )];
+       else
+               return data[i];
+}
+
 void Batch::draw() const
 {
        if(restart)
@@ -254,81 +333,6 @@ void Batch::draw() const
                glDrawRangeElements(prim_type, min_index, max_index, size(), data_type, &data[0]);
 }
 
-unsigned Batch::get_index_size() const
-{
-       if(data_type==UNSIGNED_SHORT)
-               return sizeof(unsigned short);
-       else if(data_type==UNSIGNED_INT)
-               return sizeof(unsigned);
-       return sizeof(unsigned char);
-}
-
-template<typename T>
-void Batch::append_index(T i)
-{
-       data.insert(data.end(), sizeof(T), 0);
-       *(T *)(&data[data.size()-sizeof(T)]) = i;
-}
-
-unsigned Batch::get_index(unsigned i) const
-{
-       if(data_type==UNSIGNED_SHORT)
-               return *(unsigned short *)&data[i*sizeof(unsigned short)];
-       else if(data_type==UNSIGNED_INT)
-               return *(unsigned *)&data[i*sizeof(unsigned )];
-       else
-               return data[i];
-}
-
-template<typename T, typename U>
-void Batch::expand_data()
-{
-       unsigned count = data.size()/sizeof(T);
-       data.resize(count*sizeof(U));
-       for(unsigned i=count; i--;)
-               *(U *)(&data[i*sizeof(U)]) = convert<T, U>(*(T *)(&data[i*sizeof(T)]));
-}
-
-template<typename T, typename U>
-void Batch::shrink_data()
-{
-       unsigned count = data.size()/sizeof(T);
-       for(unsigned i=0; i<count; ++i)
-               *(U *)(&data[i*sizeof(U)]) = convert<T, U>(*(T *)(&data[i*sizeof(T)]));
-       data.resize(count*sizeof(U));
-}
-
-template<typename T, typename U>
-U Batch::convert(T i) const
-{
-       if(!static_cast<T>(~i))
-               return ~0;
-       else
-               return i;
-}
-
-void Batch::unlink_from_ibuf()
-{
-       if(next_in_ibuf)
-               next_in_ibuf->prev_in_ibuf = prev_in_ibuf;
-       if(prev_in_ibuf)
-       {
-               prev_in_ibuf->next_in_ibuf = next_in_ibuf;
-               prev_in_ibuf->update_ibuf_offsets();
-       }
-       else if(next_in_ibuf)
-       {
-               next_in_ibuf->ibuf_offset = 0;
-               next_in_ibuf->update_ibuf_offsets();
-       }
-}
-
-void Batch::update_ibuf_offsets()
-{
-       for(Batch *b=this; b->next_in_ibuf; b=b->next_in_ibuf)
-               b->next_in_ibuf->ibuf_offset = b->ibuf_offset+b->data.size();
-}
-
 
 Batch::Loader::Loader(Batch &b):
        DataFile::ObjectLoader<Batch>(b)
index 4d2520a19629e830609d555163c4eca836e67443..dcc2168b312f7c6323442b7e2b52296639156ff7 100644 (file)
@@ -53,30 +53,22 @@ public:
        void set_data_type(DataType);
        DataType get_data_type() const { return data_type; }
        void use_index_buffer(Buffer *, Batch * = 0);
+private:
+       void unlink_from_ibuf();
+       void update_ibuf_offsets();
+
+public:
        Batch &append(unsigned);
        void append(const std::vector<unsigned> &);
        void append(const Batch &);
-       unsigned size() const { return data.size()/get_index_size(); }
-       unsigned get_index(unsigned) const;
-       void draw() const;
-
 private:
        unsigned get_index_size() const;
+public:
+       unsigned size() const { return data.size()/get_index_size(); }
 
-       template<typename T>
-       void append_index(T);
-
-       template<typename T, typename U>
-       void expand_data();
-
-       template<typename T, typename U>
-       void shrink_data();
-
-       template<typename T, typename U>
-       U convert(T) const;
+       unsigned get_index(unsigned) const;
 
-       void unlink_from_ibuf();
-       void update_ibuf_offsets();
+       void draw() const;
 };
 
 } // namespace GL