]> git.tdb.fi Git - libs/gl.git/blobdiff - source/mesh.h
Enable asynchronous loading of Meshes
[libs/gl.git] / source / mesh.h
index 730b724c9e81a9eee6072cac1d4762b503dbd6fc..14cb072dda26891dafb4fcf402e4055358f1a48b 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <msp/datafile/objectloader.h>
 #include "batch.h"
+#include "resource.h"
 #include "vertexarray.h"
 #include "windingtest.h"
 
@@ -17,7 +18,7 @@ Raw mesh data, consisting of a VertexArray and one or more Batches.  Though a
 Mesh can draw itself, it's usually used as part of Renderables rather than on
 its own.
 */
-class Mesh: public Bindable<Mesh>
+class Mesh: public Bindable<Mesh>, public Resource
 {
        friend class MeshBuilder;
 
@@ -33,6 +34,23 @@ public:
        };
 
 private:
+       class AsyncLoader: public Resource::AsyncLoader
+       {
+       private:
+               Mesh &mesh;
+               IO::Seekable &io;
+               Bufferable::AsyncUpdater *vertex_updater;
+               Bufferable::AsyncUpdater *index_updater;
+               unsigned phase;
+
+       public:
+               AsyncLoader(Mesh &, IO::Seekable &);
+               ~AsyncLoader();
+
+               virtual bool needs_sync() const;
+               virtual bool process();
+       };
+
        VertexArray vertices;
        std::list<Batch> batches;
        Buffer *vbuf;
@@ -40,11 +58,15 @@ private:
        unsigned vao_id;
        bool defer_buffers;
        mutable bool dirty;
+       bool disallow_rendering;
        const WindingTest *winding;
 
 public:
-       Mesh();
-       Mesh(const VertexFormat &f);
+       Mesh(ResourceManager * = 0);
+       Mesh(const VertexFormat &, ResourceManager * = 0);
+private:
+       void init(ResourceManager *);
+public:
        ~Mesh();
 
        void clear();
@@ -70,6 +92,10 @@ public:
        void bind() const;
 
        static void unbind();
+
+       virtual Resource::AsyncLoader *load(IO::Seekable &);
+       virtual UInt64 get_data_size() const;
+       virtual void unload();
 };
 
 } // namespace GL