index_type = t;
BatchBackend::set_index_type(t);
update_offset();
- dirty = true;
+ mark_dirty();
}
Batch &Batch::append(unsigned i)
append_index(i);
update_offset();
- dirty = true;
+ mark_dirty();
return *this;
}
append_index(i);
update_offset();
- dirty = true;
+ mark_dirty();
return *this;
}
append_index(other.get_index(i));
update_offset();
- dirty = true;
+ mark_dirty();
return *this;
}
}
location_dirty = true;
- dirty = true;
+ mark_dirty();
update_offset();
}
{
b->buffer = buf;
b->location_dirty = true;
- b->dirty = true;
+ b->mark_dirty();
}
for(Bufferable *b=prev_in_buffer; b; b=b->prev_in_buffer)
{
b->buffer = buf;
b->location_dirty = true;
- b->dirty = true;
+ b->mark_dirty();
}
}
{
offset = new_offset;
location_dirty = true;
- dirty = true;
+ mark_dirty();
}
if(next_in_buffer)
else if(buffer && offset+get_data_size()>buffer->get_size())
{
location_dirty = true;
- dirty = true;
+ mark_dirty();
}
}
+void Bufferable::mark_dirty()
+{
+ dirty = true;
+}
+
void Bufferable::upload_data(char *target) const
{
if(!buffer)
Base class for things that can store data in buffers. Multiple Bufferables
may be put in the same buffer.
-A dirty flag is provided for derived classes. It should be set when the data
-in the buffer is considered out of date, and is cleared by Bufferable after
-uploading fresh data to the buffer.
+Derived classes should call mark_dirty() when the stored data has changed.
*/
class Bufferable: public NonCopyable
{
Bufferable *next_in_buffer = 0;
Bufferable *prev_in_buffer = 0;
mutable bool location_dirty = false;
-protected:
mutable bool dirty = false;
+protected:
Bufferable() = default;
Bufferable(Bufferable &&);
public:
changes. */
void update_offset();
+ /* Indicates that the data of the bufferable has changed and should be
+ uploaded to the buffer again. */
+ void mark_dirty();
+
public:
/** Returns the offset of the data from the beginning of the buffer. */
std::size_t get_offset() const { return offset; }
throw invalid_operation("VertexArray::append");
data.insert(data.end(), stride, 0.0f);
update_offset();
- dirty = true;
+ mark_dirty();
return &*(data.end()-stride);
}
{
if(format.empty())
throw invalid_operation("VertexArray::modify");
- dirty = true;
+ mark_dirty();
return &data[0]+i*stride;
}