]> git.tdb.fi Git - libs/gl.git/commitdiff
Only call update_offset() once per append operation
authorMikko Rasa <tdb@tdb.fi>
Thu, 30 Aug 2012 19:54:34 +0000 (22:54 +0300)
committerMikko Rasa <tdb@tdb.fi>
Thu, 30 Aug 2012 19:54:34 +0000 (22:54 +0300)
source/batch.cpp
source/batch.h

index d4b6497fc980bbab71bf9caf794302c26ec04014..d6924a80e0cc56378d7f20b892b04ee0bb251453 100644 (file)
@@ -96,25 +96,7 @@ void Batch::set_data_type(DataType t)
 
 Batch &Batch::append(unsigned i)
 {
-       if(data.empty())
-               min_index = max_index = i;
-       else
-       {
-               min_index = min(min_index, i);
-               max_index = max(max_index, i);
-       }
-
-       if((data_type==UNSIGNED_BYTE || data_type==UNSIGNED_SHORT) && max_index>0xFFFE)
-               set_data_type(UNSIGNED_INT);
-       else if(data_type==UNSIGNED_BYTE && max_index>0xFE)
-               set_data_type(UNSIGNED_SHORT);
-
-       if(data_type==UNSIGNED_SHORT)
-               ::append<unsigned short>(data, i);
-       else if(data_type==UNSIGNED_INT)
-               ::append<unsigned>(data, i);
-       else
-               data.push_back(i);
+       append_index(i);
        
        update_offset();
        dirty = true;
@@ -127,39 +109,11 @@ void Batch::append(const vector<unsigned> &ind)
        if(ind.empty())
                return;
 
-       if(data.empty())
-               min_index = max_index = ind.front();
-
+       data.reserve(data.size()+ind.size()*get_index_size());
        for(vector<unsigned>::const_iterator i=ind.begin(); i!=ind.end(); ++i)
-       {
-               min_index = min(min_index, *i);
-               max_index = max(max_index, *i);
-       }
-
-       if((data_type==UNSIGNED_BYTE || data_type==UNSIGNED_SHORT) && max_index>0xFFFE)
-               set_data_type(UNSIGNED_INT);
-       else if(data_type==UNSIGNED_BYTE && max_index>0xFE)
-               set_data_type(UNSIGNED_SHORT);
+               append_index(*i);
 
-       unsigned base = data.size();
-       data.resize(data.size()+ind.size()*get_index_size());
-       if(data_type==UNSIGNED_SHORT)
-       {
-               unsigned short *ptr = reinterpret_cast<unsigned short *>(&data[base]);
-               for(unsigned i=0; i<ind.size(); ++i)
-                       ptr[i] = ind[i];
-       }
-       else if(data_type==UNSIGNED_INT)
-       {
-               unsigned *ptr = reinterpret_cast<unsigned *>(&data[base]);
-               for(unsigned i=0; i<ind.size(); ++i)
-                       ptr[i] = ind[i];
-       }
-       else
-       {
-               for(unsigned i=0; i<ind.size(); ++i)
-                       data[base+i] = ind[i];
-       }
+       update_offset();
        dirty = true;
 }
 
@@ -202,7 +156,33 @@ void Batch::append(const Batch &other)
 
        unsigned count = other.size();
        for(unsigned i=0; i<count; ++i)
-               append(other.get_index(i));
+               append_index(other.get_index(i));
+
+       update_offset();
+       dirty = true;
+}
+
+void Batch::append_index(unsigned i)
+{
+       if(data.empty())
+               min_index = max_index = i;
+       else
+       {
+               min_index = min(min_index, i);
+               max_index = max(max_index, i);
+       }
+
+       if((data_type==UNSIGNED_BYTE || data_type==UNSIGNED_SHORT) && max_index>0xFFFE)
+               set_data_type(UNSIGNED_INT);
+       else if(data_type==UNSIGNED_BYTE && max_index>0xFE)
+               set_data_type(UNSIGNED_SHORT);
+
+       if(data_type==UNSIGNED_SHORT)
+               ::append<unsigned short>(data, i);
+       else if(data_type==UNSIGNED_INT)
+               ::append<unsigned>(data, i);
+       else
+               data.push_back(i);
 }
 
 void Batch::upload_data() const
index 3c54089a1a449e07ff91c7f1f09774c4c57c276a..92a10e6b4923a4d82678794e3ce7653766b9ca7f 100644 (file)
@@ -53,6 +53,7 @@ public:
        void append(const std::vector<unsigned> &);
        void append(const Batch &);
 private:
+       void append_index(unsigned);
        virtual unsigned get_data_size() const { return data.size(); }
        virtual void upload_data() const;
        unsigned get_index_size() const;