summaryrefslogtreecommitdiffstats
path: root/src/scenegraph/coreapi/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/scenegraph/coreapi/renderer.cpp')
-rw-r--r--src/scenegraph/coreapi/renderer.cpp128
1 files changed, 8 insertions, 120 deletions
diff --git a/src/scenegraph/coreapi/renderer.cpp b/src/scenegraph/coreapi/renderer.cpp
index 53310ea..e082acb 100644
--- a/src/scenegraph/coreapi/renderer.cpp
+++ b/src/scenegraph/coreapi/renderer.cpp
@@ -62,125 +62,10 @@ void BindableFbo::bind() const
m_fbo->bind();
}
-// Copy bigger memory blocks at once
-static inline void arraycpy(QArray<uchar> &dest, const QArray<uchar> &src)
-{
- int extendSize = src.size();
- int size = dest.size();
- dest.extend(extendSize);
- memcpy(dest.data() + size, src.data(), extendSize * sizeof(uchar));
-}
-
-
-GeometryDataUploader::GeometryDataUploader()
- : m_use_buffers(!qApp->arguments().contains("--no-vbo"))
- , m_vertex_buffer(QGLBuffer::VertexBuffer)
- , m_index_buffer(QGLBuffer::IndexBuffer)
- , m_vertex_bound(false)
- , m_index_bound(false)
-{
-}
-
-void GeometryDataUploader::addGeometryVertex(const Geometry *g)
-{
- if (!m_use_buffers)
- return;
-
- const QArray<uchar> &vertexData = g->vertexArray();
- m_vertex_offsets.insert(g, m_vertex_data.count());
- arraycpy(m_vertex_data, vertexData);
-}
-
-void GeometryDataUploader::addGeometryIndex(const Geometry *g)
-{
- if (!m_use_buffers)
- return;
-
- if (g->indexCount()) {
- const QArray<uchar> &indexData = g->indexArray();
- m_index_offsets.insert(g, m_index_data.count());
- arraycpy(m_index_data, indexData);
- }
-}
-
-bool GeometryDataUploader::containsGeometryVertex(const Geometry *g)
-{
- if (!m_use_buffers)
- return true;
-
- return m_vertex_offsets.contains(g);
-}
-
-bool GeometryDataUploader::containsGeometryIndex(const Geometry *g)
-{
- if (!m_use_buffers)
- return true;
-
- return m_index_offsets.contains(g);
-}
-
-void GeometryDataUploader::bind()
-{
- if (!m_use_buffers)
- return;
-
- if (!m_vertex_buffer.isCreated())
- m_vertex_buffer.create();
- if (!m_index_buffer.isCreated())
- m_index_buffer.create();
-
- if (!m_vertex_bound)
- m_vertex_bound = m_vertex_buffer.bind();
- if (!m_index_bound)
- m_index_bound = m_index_buffer.bind();
-}
-
-void GeometryDataUploader::release()
-{
- if (!m_use_buffers)
- return;
-
- if (m_vertex_bound)
- m_vertex_buffer.release();
- if (m_index_bound)
- m_index_buffer.release();
- m_vertex_bound = false;
- m_index_bound = false;
-}
-
-void GeometryDataUploader::upload()
-{
- if (!m_use_buffers)
- return;
-
- bind();
-
- if (!m_vertex_data.isEmpty())
- m_vertex_buffer.allocate(m_vertex_data.data(), m_vertex_data.size());
-
- if (!m_index_data.isEmpty())
- m_index_buffer.allocate(m_index_data.data(), m_index_data.size());
-}
-
-const void *GeometryDataUploader::vertexData(const Geometry *g, int offset)
-{
- if (m_use_buffers)
- return reinterpret_cast<const void *>(m_vertex_offsets.value(g) + offset);
- else
- return reinterpret_cast<const void *>(g->vertexArray().constData() + offset);
-}
-
-const void *GeometryDataUploader::indexData(const Geometry *g)
-{
- if (m_use_buffers)
- return reinterpret_cast<const void *>(m_index_offsets.value(g));
- else
- return g->constIndexData();
-}
-
Renderer::Renderer()
- : m_clear_color(Qt::transparent)
+ : QObject()
+ , m_clear_color(Qt::transparent)
, m_root_node(0)
, m_changed_emitted(false)
{
@@ -229,7 +114,10 @@ void Renderer::renderScene(const Bindable &bindable)
preprocess();
bindable.bind();
+ GeometryDataUploader::bind();
+ GeometryDataUploader::upload();
render();
+ GeometryDataUploader::release();
m_changed_emitted = false;
}
@@ -240,7 +128,7 @@ void Renderer::setProjectMatrixToDeviceRect()
m_device_rect.x() + m_device_rect.width(),
m_device_rect.y() + m_device_rect.height(),
m_device_rect.y(),
- 100,
+ qreal(0.01),
-1);
setProjectMatrix(matrix);
}
@@ -445,14 +333,14 @@ Renderer::ClipType Renderer::updateStencilClip(const ClipNode *clip)
const QGLAttributeValue &v = geometry->attributeValue(QGL::Position);
glVertexAttribPointer(QGL::Position, v.tupleSize(), v.type(), GL_FALSE, v.stride(),
- m_geometry_uploader.vertexData(geometry));
+ GeometryDataUploader::vertexData(geometry));
m_clip_program.setUniformValue(m_clip_matrix_id, m);
QPair<int, int> range = clip->indexRange();
if (geometry->indexCount()) {
glDrawElements(GLenum(geometry->drawingMode()), range.second - range.first, geometry->indexType()
- , m_geometry_uploader.indexData(geometry));
+ , GeometryDataUploader::indexData(geometry));
} else {
glDrawArrays(GLenum(geometry->drawingMode()), range.first, range.second - range.first);
}