void ccGraphicalSegmentationTool::addPointToPolyline(int x, int y) { if ((m_state & STARTED) == 0) return; assert(m_polyVertices); assert(m_segmentationPoly); unsigned sz = m_polyVertices->size(); //particular case: we close the rectangular selection by a 2nd click if (m_rectangularSelection && sz==4 && (m_state & RUNNING)) return; //new point CCVector3 P((PointCoordinateType)x,(PointCoordinateType)y,(PointCoordinateType)0); //CTRL key pressed at the same time? bool ctrlKeyPressed = m_rectangularSelection || ((QApplication::keyboardModifiers() & Qt::ControlModifier) == Qt::ControlModifier); //start new polyline? if (((m_state & RUNNING) == 0) || sz==0 || ctrlKeyPressed) { //reset polyline m_segmentationPoly->clear(); m_polyVertices->clear(); //reset state m_state = (ctrlKeyPressed ? RECTANGLE : POLYLINE); m_state |= (STARTED | RUNNING); //we add the same point twice (the last point will be used for display only) m_polyVertices->reserve(2); m_polyVertices->addPoint(P); m_polyVertices->addPoint(P); m_segmentationPoly->addPointIndex(0); m_segmentationPoly->addPointIndex(1); } else //next points in "polyline mode" only { //we were already in 'polyline' mode? if (m_state & POLYLINE) { m_polyVertices->reserve(sz+4); //we replace last point by the current one CCVector3* lastP = const_cast<CCVector3*>(m_polyVertices->getPointPersistentPtr(sz)); *lastP = P; //and add a new (equivalent) one m_polyVertices->addPoint(P); m_segmentationPoly->addPointIndex(sz); m_segmentationPoly->setClosingState(true); } else //we must change mode { assert(false); //we shouldn't fall here?! m_state &= (~RUNNING); addPointToPolyline(x,y); return; } } if (m_associatedWin) m_associatedWin->updateGL(); }
void ccGraphicalSegmentationTool::addPointToPolyline(int x, int y) { if ((m_state & STARTED) == 0) { return; } if (!m_associatedWin) { assert(false); return; } assert(m_polyVertices); assert(m_segmentationPoly); unsigned vertCount = m_polyVertices->size(); //particular case: we close the rectangular selection by a 2nd click if (m_rectangularSelection && vertCount == 4 && (m_state & RUNNING)) return; //new point CCVector3 P(static_cast<PointCoordinateType>(x - m_associatedWin->width()/2), static_cast<PointCoordinateType>(m_associatedWin->height()/2 - y), 0); //CTRL key pressed at the same time? bool ctrlKeyPressed = m_rectangularSelection || ((QApplication::keyboardModifiers() & Qt::ControlModifier) == Qt::ControlModifier); //start new polyline? if (((m_state & RUNNING) == 0) || vertCount == 0 || ctrlKeyPressed) { //reset state m_state = (ctrlKeyPressed ? RECTANGLE : POLYLINE); m_state |= (STARTED | RUNNING); //reset polyline m_polyVertices->clear(); if (!m_polyVertices->reserve(2)) { ccLog::Error("Out of memory!"); allowPolylineExport(false); return; } //we add the same point twice (the last point will be used for display only) m_polyVertices->addPoint(P); m_polyVertices->addPoint(P); m_segmentationPoly->clear(); if (!m_segmentationPoly->addPointIndex(0,2)) { ccLog::Error("Out of memory!"); allowPolylineExport(false); return; } } else //next points in "polyline mode" only { //we were already in 'polyline' mode? if (m_state & POLYLINE) { if (!m_polyVertices->reserve(vertCount+1)) { ccLog::Error("Out of memory!"); allowPolylineExport(false); return; } //we replace last point by the current one CCVector3* lastP = const_cast<CCVector3*>(m_polyVertices->getPointPersistentPtr(vertCount-1)); *lastP = P; //and add a new (equivalent) one m_polyVertices->addPoint(P); if (!m_segmentationPoly->addPointIndex(vertCount)) { ccLog::Error("Out of memory!"); return; } m_segmentationPoly->setClosed(true); } else //we must change mode { assert(false); //we shouldn't fall here?! m_state &= (~RUNNING); addPointToPolyline(x,y); return; } } m_associatedWin->redraw(true, false); }