summaryrefslogtreecommitdiffstats
path: root/src/scenegraph/coreapi/geometry.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/scenegraph/coreapi/geometry.h')
-rw-r--r--src/scenegraph/coreapi/geometry.h50
1 files changed, 42 insertions, 8 deletions
diff --git a/src/scenegraph/coreapi/geometry.h b/src/scenegraph/coreapi/geometry.h
index 8a9e0b3..a6f3028 100644
--- a/src/scenegraph/coreapi/geometry.h
+++ b/src/scenegraph/coreapi/geometry.h
@@ -55,6 +55,7 @@ class Geometry
public:
Geometry(); // Creates a null geometry.
Geometry(const QVector<QGLAttributeDescription> &description, GLenum indexType = GL_UNSIGNED_SHORT);
+ ~Geometry();
void *vertexData();
const void *constVertexData() const { return m_vertex_data.constData(); }
@@ -103,15 +104,7 @@ public:
bool isNull() const { return m_vertex_description.isEmpty(); }
- bool isVertexDataDirty() const { return m_isVertexDataDirty; }
- void setVertexDataDirty(bool d) { m_isVertexDataDirty = d; }
- bool isIndexDataDirty() const { return m_isIndexDataDirty; }
- void setIndexDataDirty(bool d) { m_isIndexDataDirty = d; }
-
protected:
- bool m_isVertexDataDirty;
- bool m_isIndexDataDirty;
-
QArray<uchar> m_vertex_data;
QArray<uchar> m_index_data;
@@ -122,4 +115,45 @@ protected:
int m_index_stride;
};
+class GeometryDataUploader
+{
+public:
+ static void registerGeometry(const Geometry *);
+ static void unregisterGeometry(const Geometry *);
+
+ static void bind();
+ static void release();
+ static void upload();
+
+ static const void *vertexData(const Geometry *g, int offset = 0);
+ static const void *indexData(const Geometry *g);
+
+ static void setUseBuffers(bool b) { m_use_buffers = b; }
+ static bool useBuffers() { return m_use_buffers; }
+
+ static void markVertexDirty() { m_vertex_dirty = true; }
+ static void markIndexDirty() { m_index_dirty = true; }
+
+private:
+ static void addGeometryVertex(const Geometry *);
+ static void addGeometryIndex(const Geometry *);
+
+ static void clearVertexData() { m_vertex_offsets.clear(); m_vertex_data.clear(); }
+ static void clearIndexData() { m_index_offsets.clear(); m_index_data.clear(); }
+
+ static bool m_use_buffers;
+ static QSet<const Geometry *> m_geometries;
+ static QGLBuffer m_vertex_buffer;
+ static QGLBuffer m_index_buffer;
+ static QArray<uchar> m_vertex_data;
+ static QArray<uchar> m_index_data;
+ static QHash<const Geometry *, int> m_vertex_offsets;
+ static QHash<const Geometry *, int> m_index_offsets;
+ static bool m_vertex_bound;
+ static bool m_index_bound;
+ static bool m_vertex_dirty;
+ static bool m_index_dirty;
+};
+
+
#endif