]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/bufferable.h
Use a member function to set the dirty flag in Bufferable
[libs/gl.git] / source / core / bufferable.h
index 4a4114d0ce683483717eee9baf0770e3b7ab7c4b..b430b726277c657fac569fb334bf5c69f624409e 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef MSP_GL_BUFFERABLE_H_
 #define MSP_GL_BUFFERABLE_H_
 
 #ifndef MSP_GL_BUFFERABLE_H_
 #define MSP_GL_BUFFERABLE_H_
 
+#include <msp/core/noncopyable.h>
+
 namespace Msp {
 namespace GL {
 
 namespace Msp {
 namespace GL {
 
@@ -10,11 +12,9 @@ class Buffer;
 Base class for things that can store data in buffers.  Multiple Bufferables
 may be put in the same 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
+class Bufferable: public NonCopyable
 {
 public:
        /**
 {
 public:
        /**
@@ -41,17 +41,18 @@ private:
        Bufferable *next_in_buffer = 0;
        Bufferable *prev_in_buffer = 0;
        mutable bool location_dirty = false;
        Bufferable *next_in_buffer = 0;
        Bufferable *prev_in_buffer = 0;
        mutable bool location_dirty = false;
-protected:
        mutable bool dirty = false;
 
        mutable bool dirty = false;
 
+protected:
        Bufferable() = default;
        Bufferable() = default;
+       Bufferable(Bufferable &&);
 public:
        virtual ~Bufferable();
 
        /** Sets the buffer to use.  If prev is not null, it must use the same
        buffer, and this object is inserted after it.
 
 public:
        virtual ~Bufferable();
 
        /** Sets the buffer to use.  If prev is not null, it must use the same
        buffer, and this object is inserted after it.
 
-       Date is not uploaded immediately, but only when refresh() is called. */
+       Data is not uploaded immediately, but only when refresh() is called. */
        void use_buffer(Buffer *, Bufferable *prev = 0);
 
        /** Sets the buffer for the entire chain of objects. */
        void use_buffer(Buffer *, Bufferable *prev = 0);
 
        /** Sets the buffer for the entire chain of objects. */
@@ -91,6 +92,10 @@ protected:
        changes. */
        void update_offset();
 
        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; }
 public:
        /** Returns the offset of the data from the beginning of the buffer. */
        std::size_t get_offset() const { return offset; }