diff options
Diffstat (limited to 'src/scenegraph/coreapi/renderer.cpp')
-rw-r--r-- | src/scenegraph/coreapi/renderer.cpp | 128 |
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); } |