return a->matrix() < b->matrix();
}
-
-QSGDefaultRenderer::IndexNodePair::IndexNodePair(int i, QSGNode *node)
- : QPair<int, QSGNode *>(i, node)
-{
-}
-
-bool QSGDefaultRenderer::IndexNodePair::operator < (const QSGDefaultRenderer::IndexNodePair &other) const
-{
- return nodeLessThan(second, other.second);
-}
-
-
-QSGDefaultRenderer::IndexNodePairHeap::IndexNodePairHeap()
- : v(64)
-{
-}
-
-void QSGDefaultRenderer::IndexNodePairHeap::insert(const QSGDefaultRenderer::IndexNodePair &x)
-{
- int i = v.size();
- v.add(x);
- while (i != 0 && v.at(i) < v.at(parent(i))) {
- qSwap(v.at(parent(i)), v.at(i));
- i = parent(i);
- }
-}
-
-QSGDefaultRenderer::IndexNodePair QSGDefaultRenderer::IndexNodePairHeap::pop()
-{
- IndexNodePair x = top();
- if (v.size() > 1)
- qSwap(v.first(), v.last());
- v.pop_back();
- int i = 0;
- while (left(i) < v.size()) {
- int low = left(i);
- if (right(i) < v.size() && v.at(right(i)) < v.at(low))
- low = right(i);
- if (!(v.at(low) < v.at(i)))
- break;
- qSwap(v.at(i), v.at(low));
- i = low;
- }
- return x;
-}
-
-
QSGDefaultRenderer::QSGDefaultRenderer(QSGContext *context)
: QSGRenderer(context)
, m_opaqueNodes(64)
, m_transparentNodes(64)
- , m_tempNodes(64)
, m_renderGroups(4)
, m_rebuild_lists(false)
, m_needs_sorting(false)
const quint32 rebuildBits = QSGNode::DirtyNodeAdded | QSGNode::DirtyNodeRemoved
| QSGNode::DirtyMaterial | QSGNode::DirtyOpacity
- | QSGNode::DirtyForceUpdate | QSGNode::DirtyChildrenDoNotOverlap;
+ | QSGNode::DirtyForceUpdate;
if (state & rebuildBits)
m_rebuild_lists = true;
glEnable(GL_DEPTH_TEST);
glDepthMask(true);
- glDepthFunc(GL_GREATER);
+ glDepthFunc(GL_LESS);
#if defined(QT_OPENGL_ES)
- glClearDepthf(0);
+ glClearDepthf(1);
#else
- glClearDepth(0);
+ glClearDepth(1);
#endif
glDisable(GL_SCISSOR_TEST);
int debugtimeSorting = debugTimer.elapsed();
#endif
- m_renderOrderMatrix.setToIdentity();
- m_renderOrderMatrix.scale(1, 1, qreal(1) / m_currentRenderOrder);
-
int opaqueStart = 0;
int transparentStart = 0;
for (int i = 0; i < m_renderGroups.size(); ++i) {
if (!node->firstChild())
return;
-#ifdef FORCE_NO_REORDER
- static bool reorder = false;
-#else
- static bool reorder = qApp->arguments().contains(QLatin1String("--reorder"));
-#endif
-
- if (reorder && node->firstChild() != node->lastChild() && (node->flags() & QSGNode::ChildrenDoNotOverlap)) {
- QVarLengthArray<int, 16> beginIndices;
- QVarLengthArray<int, 16> endIndices;
- int baseCount = m_transparentNodes.size();
- int baseGroupCount = m_renderGroups.size();
- int count = 0;
- for (QSGNode *c = node->firstChild(); c; c = c->nextSibling()) {
- beginIndices.append(m_transparentNodes.size());
- buildLists(c);
- endIndices.append(m_transparentNodes.size());
- ++count;
- }
-
- int childNodeCount = m_transparentNodes.size() - baseCount;
- // Don't reorder if new render groups were added.
- if (m_renderGroups.size() == baseGroupCount && childNodeCount) {
- m_tempNodes.reset();
- m_tempNodes.reserve(childNodeCount);
- while (childNodeCount) {
- for (int i = 0; i < count; ++i) {
- if (beginIndices[i] != endIndices[i])
- m_heap.insert(IndexNodePair(i, m_transparentNodes.at(beginIndices[i]++)));
- }
- while (!m_heap.isEmpty()) {
- IndexNodePair pair = m_heap.pop();
- m_tempNodes.add(pair.second);
- --childNodeCount;
- int i = pair.first;
- if (beginIndices[i] != endIndices[i] && !nodeLessThan(m_transparentNodes.at(beginIndices[i]), pair.second))
- m_heap.insert(IndexNodePair(i, m_transparentNodes.at(beginIndices[i]++)));
- }
- }
- Q_ASSERT(m_tempNodes.size() == m_transparentNodes.size() - baseCount);
-
- qMemCopy(&m_transparentNodes.at(baseCount), &m_tempNodes.at(0), m_tempNodes.size() * sizeof(QSGGeometryNode *));
- }
- } else {
- for (QSGNode *c = node->firstChild(); c; c = c->nextSibling())
- buildLists(c);
- }
+ for (QSGNode *c = node->firstChild(); c; c = c->nextSibling())
+ buildLists(c);
}
void QSGDefaultRenderer::renderNodes(QSGNode *const *nodes, int count)
}
if (changes & QSGRenderNode::DepthState) {
#if defined(QT_OPENGL_ES)
- glClearDepthf(0);
+ glClearDepthf(1);
#else
- glClearDepth(0);
+ glClearDepth(1);
#endif
if (m_clear_mode & QSGRenderer::ClearDepthBuffer) {
glDepthMask(true);
glClear(GL_DEPTH_BUFFER_BIT);
}
glDepthMask(false);
- glDepthFunc(GL_GREATER);
+ glDepthFunc(GL_LESS);
}
if (changes & QSGRenderNode::ColorState)
bindable()->reactivate();
if (changeRenderOrder) {
currentRenderOrder = geomNode->renderOrder();
m_current_projection_matrix.setColumn(3, projection.column(3)
- + currentRenderOrder
+ + (m_currentRenderOrder - 1 - 2 * currentRenderOrder)
* m_current_projection_matrix.column(2));
updates |= QSGMaterialShader::RenderState::DirtyMatrix;
}