QSGNode *PhosphorRender::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { if (!m_ybuffer) { return 0; } QSGGeometryNode *node = 0; QSGGeometry *geometry = 0; Material *material = 0; unsigned n_points; if (m_xbuffer) { n_points = std::min(m_xbuffer->size(), m_ybuffer->size()); } else { n_points = m_ybuffer->countPointsBetween(m_xmin, m_xmax); } n_points = std::min(n_points,(unsigned) 65767); if (!oldNode) { node = new QSGGeometryNode; geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), n_points); geometry->setDrawingMode(GL_POINTS); node->setGeometry(geometry); node->setFlag(QSGNode::OwnsGeometry); material = new Material; material->setFlag(QSGMaterial::Blending); node->setMaterial(material); node->setFlag(QSGNode::OwnsMaterial); } else { node = static_cast<QSGGeometryNode *>(oldNode); geometry = node->geometry(); geometry->allocate(n_points); geometry->setLineWidth(m_pointSize); material = static_cast<Material*>(node->material()); } QRectF bounds = boundingRect(); material->transformation.setToIdentity(); material->transformation.scale(bounds.width()/(m_xmax - m_xmin), bounds.height()/(m_ymin - m_ymax)); material->transformation.translate(-m_xmin, -m_ymax); material->pointSize = m_pointSize; material->color = m_color; auto verticies = geometry->vertexDataAsPoint2D(); if (m_xbuffer) { for (unsigned i=0; i<n_points; i++) { verticies[i].set(m_xbuffer->get(i), m_ybuffer->get(i)); } } else { m_ybuffer->toVertexData(m_xmin, m_xmax, verticies, n_points); } node->markDirty(QSGNode::DirtyGeometry | QSGNode::DirtyMaterial); return node; }
//! [4] QSGNode *BezierCurve::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { QSGGeometryNode *node = 0; QSGGeometry *geometry = 0; if (!oldNode) { node = new QSGGeometryNode; //! [4] //! [5] geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), m_segmentCount); geometry->setLineWidth(2); geometry->setDrawingMode(GL_LINE_STRIP); node->setGeometry(geometry); node->setFlag(QSGNode::OwnsGeometry); //! [5] //! [6] QSGFlatColorMaterial *material = new QSGFlatColorMaterial; material->setColor(QColor(255, 0, 0)); node->setMaterial(material); node->setFlag(QSGNode::OwnsMaterial); //! [6] //! [7] } else { node = static_cast<QSGGeometryNode *>(oldNode); geometry = node->geometry(); geometry->allocate(m_segmentCount); } //! [7] //! [8] QRectF bounds = boundingRect(); QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D(); for (int i = 0; i < m_segmentCount; ++i) { qreal t = i / qreal(m_segmentCount - 1); qreal invt = 1 - t; QPointF pos = invt * invt * invt * m_p1 + 3 * invt * invt * t * m_p2 + 3 * invt * t * t * m_p3 + t * t * t * m_p4; float x = bounds.x() + pos.x() * bounds.width(); float y = bounds.y() + pos.y() * bounds.height(); vertices[i].set(x, y); } node->markDirty(QSGNode::DirtyGeometry); //! [8] //! [9] return node; }
void SceneGraphDeviceContext::DrawLine(int x1, int y1, int x2, int y2) { vrv::Pen currentPen = m_penStack.top(); QSGGeometry *geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 2); geometry->setDrawingMode(GL_LINES); geometry->setLineWidth(translate(currentPen.GetWidth())); geometry->vertexDataAsPoint2D()[0].set(translateX(x1), translateY(y1)); geometry->vertexDataAsPoint2D()[1].set(translateX(x2), translateY(y2)); QSGFlatColorMaterial *material = new QSGFlatColorMaterial; material->setColor(static_cast<QRgb>(currentPen.GetColour())); QSGGeometryNode *node = new QSGGeometryNode; node->setGeometry(geometry); node->setFlag(QSGNode::OwnsGeometry); node->setMaterial(material); node->setFlag(QSGNode::OwnsMaterial); AddGeometryNode(node); }
QSGNode *QPScrollingCurve::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *) { QSGGeometryNode *node = 0; QSGGeometry *geometry = 0; QSGFlatColorMaterial *material = 0; if (!oldNode) { node = new QSGGeometryNode; geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), m_data.size()); geometry->setLineWidth(2); geometry->setDrawingMode(GL_LINE_STRIP); node->setGeometry(geometry); node->setFlag(QSGNode::OwnsGeometry); material = new QSGFlatColorMaterial; material->setColor(m_color); node->setMaterial(material); node->setFlag(QSGNode::OwnsMaterial); node->markDirty(QSGNode::DirtyMaterial); } else { node = static_cast<QSGGeometryNode *>(oldNode); geometry = node->geometry(); geometry->allocate(m_data.size()); material = static_cast<QSGFlatColorMaterial*>(node->material()); if (material->color() != m_color) { material->setColor(m_color); node->markDirty(QSGNode::DirtyMaterial); } } QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D(); for (uint i = 0; i < m_data.size(); ++i) { QPointF p(i, m_data[i]); vertices[i].set(p.x(), p.y()); } node->markDirty(QSGNode::DirtyGeometry); return node; }
QSGNode* drawRect(const QRect& rect, QSGNode* oldNode) { QSGGeometryNode* node; if (oldNode == nullptr) { node = new QSGGeometryNode; QSGGeometry* geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 8); geometry->setDrawingMode(GL_LINES); geometry->setLineWidth(1); QSGFlatColorMaterial* material = new QSGFlatColorMaterial; material->setColor(QGuiApplication::palette().color(QPalette::Normal, QPalette::WindowText)); node->setGeometry(geometry); node->setFlag(QSGNode::OwnsGeometry); node->setMaterial(material); node->setFlag(QSGNode::OwnsMaterial); } else { node = static_cast<QSGGeometryNode*>(oldNode); } QSGGeometry* geometry = node->geometry(); // FIXME: check if these really have to be updated geometry->vertexDataAsPoint2D()[0].set(rect.topLeft().x(), rect.topLeft().y()); geometry->vertexDataAsPoint2D()[1].set(rect.topRight().x(), rect.topRight().y()); geometry->vertexDataAsPoint2D()[2].set(rect.topRight().x(), rect.topRight().y()); geometry->vertexDataAsPoint2D()[3].set(rect.bottomRight().x(), rect.bottomRight().y()); geometry->vertexDataAsPoint2D()[4].set(rect.bottomRight().x(), rect.bottomRight().y()); geometry->vertexDataAsPoint2D()[5].set(rect.bottomLeft().x(), rect.bottomLeft().y()); geometry->vertexDataAsPoint2D()[6].set(rect.bottomLeft().x(), rect.bottomLeft().y()); geometry->vertexDataAsPoint2D()[7].set(rect.topLeft().x(), rect.topLeft().y()); node->markDirty(QSGNode::DirtyGeometry); return node; }
QSGGeometry *NotesGeometry::createGeometry(QVector<int> &ids, const TimelineModel *model, const TimelineRenderState *parentState, bool collapsed) { float rowHeight = TimelineModel::defaultRowHeight(); QSGGeometry *geometry = new QSGGeometry(point2DWithDistanceFromTop(), ids.count() * 2); geometry->setDrawingMode(GL_LINES); geometry->setLineWidth(3); Point2DWithDistanceFromTop *v = static_cast<Point2DWithDistanceFromTop *>(geometry->vertexData()); for (int i = 0; i < ids.count(); ++i) { int timelineIndex = ids[i]; float horizontalCenter = ((model->startTime(timelineIndex) + model->endTime(timelineIndex)) / (qint64)2 - parentState->start()) * parentState->scale(); float verticalStart = (collapsed ? (model->collapsedRow(timelineIndex) + 0.1) : 0.1) * rowHeight; float verticalEnd = verticalStart + 0.8 * rowHeight; v[i * 2].set(horizontalCenter, verticalStart, 0); v[i * 2 + 1].set(horizontalCenter, verticalEnd, 1); } return geometry; }
QSGNode * DataSetView::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { if (width() <= 0 || height() <= 0) { delete oldNode; return 0; } //if(recalculateCellSizes) calculateCellContentSizes(); const QRectF rect = boundingRect(); const int linesPerNode = 1000; //Or something? should be multiple of 2 though if(!oldNode) oldNode = new QSGNode(); QSGGeometryNode * currentNode = static_cast<QSGGeometryNode*>(oldNode->firstChild()); for(int lineIndex=0; lineIndex<_lines.size();) { if(currentNode == NULL) { currentNode = new QSGGeometryNode; currentNode->setFlag(QSGNode::OwnsMaterial, false); currentNode->setFlag(QSGNode::OwnsGeometry, true); currentNode->setMaterial(&material); oldNode->appendChildNode(currentNode); } int geomSize = std::min(linesPerNode, (int)(_lines.size() - lineIndex)); geomSize *= 2; QSGGeometry *geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), geomSize); geometry->setLineWidth(1); geometry->setDrawingMode(GL_LINES); QSGGeometry::Point2D *points = geometry->vertexDataAsPoint2D(); for(int geomIndex=0; geomIndex<geomSize; geomIndex+=2) { points[geomIndex ].x = _lines[lineIndex].first.x() + rect.left(); points[geomIndex ].y = _lines[lineIndex].first.y() + rect.top(); points[geomIndex+1].x = _lines[lineIndex].second.x() + rect.left(); points[geomIndex+1].y = _lines[lineIndex].second.y() + rect.top(); lineIndex++; } currentNode->setGeometry(geometry); currentNode = static_cast<QSGGeometryNode*>(currentNode->nextSibling()); } std::queue<QSGGeometryNode*> killThem; while(currentNode != NULL) //superfluous children! Lets kill em { killThem.push(currentNode); currentNode = static_cast<QSGGeometryNode*>(currentNode->nextSibling()); } while(killThem.size() > 0) { QSGGeometryNode * childToDie = killThem.front(); killThem.pop(); delete childToDie; } return oldNode; }
QSGNode *GraphConnection::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { if (m_source == m_sink) return oldNode; QSGGeometryNode *node = 0; QSGGeometry *geometry = 0; QPointF p1, p2, p3, p4; p1.setX(m_source.x()); p1.setY(m_source.y()); p4.setX(m_sink.x()); p4.setY(m_sink.y()); p2.setX(p1.x()); p3.setX(p4.x()); if (p1.y() < p4.y()) { p2.setY(p1.y() * 0.75 + p4.y() * 0.25); p3.setY(p4.y() * 0.75 + p1.y() * 0.25); } else { p2.setY(p1.y() - (p4.y()-p1.y())*0.25); p3.setY(p4.y() + (p4.y()-p1.y())*0.25); } // quick 'n' dirty estimation of bezier length // http://steve.hollasch.net/cgindex/curves/cbezarclen.html qreal l1 = (QVector2D(p2)-QVector2D(p1)).length() + (QVector2D(p3)-QVector2D(p2)).length() + (QVector2D(p4)-QVector2D(p3)).length(); qreal l0 = (QVector2D(p4)-QVector2D(p1)).length(); qreal length = 0.5*l0 + 0.5*l1; int segmentCount = length; if (!oldNode) { node = new QSGGeometryNode; geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), segmentCount); geometry->setLineWidth(2); geometry->setDrawingMode(GL_LINE_STRIP); node->setGeometry(geometry); node->setFlag(QSGNode::OwnsGeometry); QSGFlatColorMaterial *material = new QSGFlatColorMaterial; material->setColor(QColor(0, 0, 0)); node->setMaterial(material); node->setFlag(QSGNode::OwnsMaterial); } else { node = static_cast<QSGGeometryNode *>(oldNode); geometry = node->geometry(); geometry->allocate(segmentCount); } QRectF bounds = boundingRect(); QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D(); for (int i = 0; i < segmentCount; ++i) { qreal t = i / qreal(segmentCount - 1); qreal invt = 1 - t; // Bezier QPointF pos = invt * invt * invt * p1 + 3 * invt * invt * t * p2 + 3 * invt * t * t * p3 + t * t * t * p4; float x = pos.x(); float y = pos.y(); vertices[i].set(x, y); } return node; }