void SplitPolygon(std::vector<pcs_polygon> &polygons, int polynum, vector3d plane_point, vector3d plane_normal, std::vector<pcs_polygon> &newpolys) { std::vector<pcs_polygon> splitpolys(2); // 0 = front vert, 1 = back vert std::vector<int> pairs; std::vector<pcs_vertex> points; pairs.resize(polygons[polynum].verts.size() * 2); pcs_vertex temp; unsigned int i, j = 0; float uvdelta; for (i = 0; i < polygons[polynum].verts.size() * 2; i += 2) { pairs[i] = j % polygons[polynum].verts.size(); pairs[i+1] = (j+1) % polygons[polynum].verts.size(); j++; } float dtempa, dtempb; // compile the new list of points for (i = 0; i < pairs.size(); i += 2) { dtempa = DistanceToPlane(polygons[polynum].verts[pairs[i]].point, plane_point, plane_normal); dtempb = DistanceToPlane(polygons[polynum].verts[pairs[i+1]].point, plane_point, plane_normal); if ((dtempa <= 0.0001 && dtempa >= -0.0001) || (dtempb <= 0.0001 && dtempb >= -0.0001)) // one of these points lays on the plane... add them both without modification { AddIfNotInList(points, polygons[polynum].verts[pairs[i]]); AddIfNotInList(points, polygons[polynum].verts[pairs[i+1]]); } else // neither of them was not on the plane.. are they on the same side? { if (InFrontofPlane(polygons[polynum].verts[pairs[i]].point, plane_point, plane_normal) == InFrontofPlane(polygons[polynum].verts[pairs[i+1]].point, plane_point, plane_normal)) // both on same side - add them { AddIfNotInList(points, polygons[polynum].verts[pairs[i]]); AddIfNotInList(points, polygons[polynum].verts[pairs[i+1]]); } else // different sides - cut and add { uvdelta = FindIntersection(temp.point, polygons[polynum].verts[pairs[i]].point, polygons[polynum].verts[pairs[i+1]].point, plane_point, plane_normal); temp.norm = polygons[polynum].norm; temp.u = uvdelta * (polygons[polynum].verts[pairs[i]].u - polygons[polynum].verts[pairs[i+1]].u); temp.v = uvdelta * (polygons[polynum].verts[pairs[i]].v - polygons[polynum].verts[pairs[i+1]].v); AddIfNotInList(points, polygons[polynum].verts[pairs[i]]); AddIfNotInList(points, temp); AddIfNotInList(points, polygons[polynum].verts[pairs[i+1]]); } } } // split the polygons with the list we have int in = 0; for (i = 0; i < points.size(); i++) { dtempa = DistanceToPlane(points[i].point, plane_point, plane_normal) ; if (dtempa <= 0.0001 && dtempa >= -0.0001) // there WILL be two points in the list this is true for { AddIfNotInList(splitpolys[0].verts, points[i]); AddIfNotInList(splitpolys[1].verts, points[i]); if (in == 0) in = 1; else in = 0; } else { AddIfNotInList(splitpolys[in].verts, points[i]); } } // triangle our new polylist TriangulateMesh(splitpolys); // replace our current poly with polygon zero - add the others polygons[polynum] = splitpolys[0]; in = newpolys.size(); newpolys.resize(in+splitpolys.size()); for (i = 1; i < splitpolys.size(); i++) { newpolys[in+i] = splitpolys[i]; } }
void MainWindow::createActions() { /* File MENU */ // New newAct = new QAction(QIcon(":/images/document-new.png"), tr("&New"), this); newAct->setShortcuts(QKeySequence::New); newAct->setStatusTip(tr("Create a new file")); connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); // Open openAct = new QAction(QIcon(":/images/folder-open.png"), tr("&Open..."), this); openAct->setShortcuts(QKeySequence::Open); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); // Save saveAct = new QAction(QIcon(":/images/document-save.png"), tr("Save"), this); saveAct->setStatusTip(tr("Save file")); connect(saveAct, SIGNAL(triggered()), this, SLOT(OutputFoldedOBJ())); // Save As sub Menu saveAsFoldedOBJ = new QAction(tr("Folded OBJ"), this); saveAsFoldedOBJ->setStatusTip(tr("Save file as Folded OBJ")); connect(saveAsFoldedOBJ, SIGNAL(triggered()), this, SLOT(OutputFoldedOBJ()) ); saveAsUnfoldedOBJ = new QAction(tr("Unfolded OBJ"), this); saveAsUnfoldedOBJ->setStatusTip(tr("Save file as Unfolded OBJ")); connect(saveAsUnfoldedOBJ, SIGNAL(triggered()), this, SLOT(OutputUnfoldedOBJ()) ); saveAsFoldedINF= new QAction(tr("Folded INF"), this); saveAsFoldedINF->setStatusTip(tr("Save file as Folded INF")); connect(saveAsFoldedINF, SIGNAL(triggered()), this, SLOT(OutputFoldedINF()) ); saveAsUnfoldedINF = new QAction(tr("Unfolded INF"), this); saveAsUnfoldedINF->setStatusTip(tr("Save file as Unfolded INF")); connect(saveAsUnfoldedINF, SIGNAL(triggered()), this, SLOT(OutputUnFoldedINF()) ); // Export As exportAct = new QAction(tr("Export"), this); exportAct->setStatusTip(tr("Export file as")); connect(exportAct, SIGNAL(triggered()), this, SLOT(exportToFile())); // Print printAct = new QAction(tr("Print"), this); printAct->setStatusTip(tr("Print file ")); connect(printAct, SIGNAL(triggered()), this, SLOT(print())); // Quit exitAct = new QAction(tr("Exit"), this); exitAct->setStatusTip(tr("Quit ")); connect(exitAct, SIGNAL(triggered()), this, SLOT(quitApp())); /* Edit MENU */ // Cut, copy and paste cutAct = new QAction(tr("Cut"), this); cutAct->setStatusTip(tr("Cut text")); cutAct->setEnabled(false); copyAct = new QAction(tr("Copy"), this); copyAct->setStatusTip(tr("Copy text")); copyAct->setEnabled(false); pasteAct = new QAction(tr("Paste"), this); pasteAct->setStatusTip(tr("Paste text")); pasteAct->setEnabled(false); connect(mainwidget, SIGNAL(copyAvailable(bool)),cutAct, SLOT(setEnabled(bool))); connect(mainwidget, SIGNAL(copyAvailable(bool)),copyAct, SLOT(setEnabled(bool))); connect(mainwidget, SIGNAL(copyAvailable(bool)),pasteAct, SLOT(setEnabled(bool))); /* * Mesh Operations Menu */ triangulate = new QAction(tr("Triangulate mesh"), this);; triangulate->setStatusTip(tr("Triangulate mesh")); connect(triangulate, SIGNAL(triggered()), this, SLOT(TriangulateMesh())); /* Select Edges */ selectAllEdges = new QAction(tr("Select All"), this);; selectAllEdges->setStatusTip(tr("Select All")); connect(selectAllEdges, SIGNAL(triggered()), this, SLOT(SelectAllEdges())); clearSelectionEdges = new QAction(tr("Clear Selected Edges"), this);; clearSelectionEdges->setStatusTip(tr("Clear Selected Edges")); connect(clearSelectionEdges, SIGNAL(triggered()), this, SLOT(ClearSelectionEdges())); selectInverseEdges = new QAction(tr( "Select Inverse Edges"), this); selectInverseEdges->setStatusTip(tr( "Select Inverse Edges")); connect(selectInverseEdges, SIGNAL(triggered()), this, SLOT(SelectInverseEdges())); selectMultipleEdges = new QAction(tr("Select Multiple Edges"), this);; selectMultipleEdges->setStatusTip(tr("Select Multiple Edges")); connect(selectMultipleEdges, SIGNAL(triggered()), this, SLOT(SelectMultipleEdges())); selectSimilarEdges = new QAction(tr("Select Similar Edges"), this);; selectSimilarEdges->setStatusTip(tr("Select Similar Edges")); connect(selectSimilarEdges, SIGNAL(triggered()), this, SLOT(SelectSimilarEdges())); selectWindowEdges = new QAction(tr("Select Window Edges"), this);; selectWindowEdges->setStatusTip(tr("Select Window Edges")); connect(selectWindowEdges, SIGNAL(triggered()), this, SLOT(SelectWindowEdges())); selectConnectedComponentEdges = new QAction(tr("Select Connected Component Edges"), this);; selectConnectedComponentEdges->setStatusTip(tr("Select Connected Component Edges")); connect(selectConnectedComponentEdges, SIGNAL(triggered()), this, SLOT(SelectConnectedComponentEdges())); selectShortestPathBetween2Vertices = new QAction(tr("Select Shortest Path Between 2 Vertices"), this);; selectShortestPathBetween2Vertices->setStatusTip(tr("Select Shortest Path Between 2 Vertices")); connect(selectShortestPathBetween2Vertices, SIGNAL(triggered()), this, SLOT(SelectShortestPathBetween2Vertices())); growSelectionEdges = new QAction(tr("Grow Selection Edges"), this);; growSelectionEdges->setStatusTip(tr("Grow Selection Edges")); connect(growSelectionEdges, SIGNAL(triggered()), this, SLOT(GrowSelectionEdges())); shrinkSelectionEdges = new QAction(tr("Shrink Selection Edges"), this);; shrinkSelectionEdges->setStatusTip(tr("Shrink Selection Edges")); connect(shrinkSelectionEdges, SIGNAL(triggered()), this, SLOT(ShrinkSelectionEdges())); selectEdgeLoop = new QAction(tr("Select Edge Loop"), this);; selectEdgeLoop->setStatusTip(tr("Select Edge Loop")); connect(selectEdgeLoop, SIGNAL(triggered()), this, SLOT(SelectEdgeLoop())); selectEdgeRing = new QAction(tr("Select Edge Ring"), this);; selectEdgeRing->setStatusTip(tr("Select Edge Ring")); connect(selectEdgeRing, SIGNAL(triggered()), this, SLOT(SelectEdgeRing())); selectEdgesFromFaces = new QAction(tr("Select Edges From Faces"), this);; selectEdgesFromFaces->setStatusTip(tr("Select Edges From Faces")); connect(selectEdgesFromFaces, SIGNAL(triggered()), this, SLOT(SelectEdgesFromFaces())); selectEdgesFromVertices = new QAction(tr("Select Edges From Vertices"), this);; selectEdgesFromVertices->setStatusTip(tr("Select Edges From Vertices")); connect(selectEdgesFromVertices, SIGNAL(triggered()), this, SLOT(SelectEdgesFromVertices())); /* Select Faces */ selectAllFaces = new QAction(tr("Select All"), this);; selectAllFaces->setStatusTip(tr("Select All")); connect(selectAllFaces, SIGNAL(triggered()), this, SLOT(SelectAllFaces())); clearSelectionFaces = new QAction(tr("Clear Selected Faces"), this);; clearSelectionFaces->setStatusTip(tr("Clear Selected Faces")); connect(clearSelectionFaces, SIGNAL(triggered()), this, SLOT(ClearSelectionFaces())); selectInverseFaces = new QAction(tr( "Select Inverse Faces"), this); selectInverseFaces->setStatusTip(tr( "Select Inverse Faces")); connect(selectInverseFaces, SIGNAL(triggered()), this, SLOT(SelectInverseFaces())); selectMultipleFaces = new QAction(tr("Select Multiple Faces"), this);; selectMultipleFaces->setStatusTip(tr("Select Multiple Faces")); connect(selectMultipleFaces, SIGNAL(triggered()), this, SLOT(SelectMultipleFaces())); selectSimilarFaces = new QAction(tr("Select Similar Faces"), this);; selectSimilarFaces->setStatusTip(tr("Select Similar Faces")); connect(selectSimilarFaces, SIGNAL(triggered()), this, SLOT(SelectSimilarFaces())); selectWindowFaces = new QAction(tr("Select Window Faces"), this);; selectWindowFaces->setStatusTip(tr("Select Window Faces")); connect(selectWindowFaces, SIGNAL(triggered()), this, SLOT(SelectWindowFaces())); selectConnectedComponentFaces = new QAction(tr("Select Connected Component Faces"), this);; selectConnectedComponentFaces->setStatusTip(tr("Select Connected Component Faces")); connect(selectConnectedComponentFaces, SIGNAL(triggered()), this, SLOT(SelectConnectedComponentFaces())); selectFaceLoop = new QAction(tr("Select Face Loop"), this);; selectFaceLoop->setStatusTip(tr("Select Face Loop")); connect(selectFaceLoop, SIGNAL(triggered()), this, SLOT(SelectFaceLoop())); selectFacesFromVertices = new QAction(tr("Select Faces From Vertices"), this);; selectFacesFromVertices->setStatusTip(tr("Select Faces From Vertices")); connect(selectFacesFromVertices, SIGNAL(triggered()), this, SLOT(SelectFacesFromVertices())); selectFacesFromEdges= new QAction(tr("Select Faces From Edges"), this);; selectFacesFromEdges->setStatusTip(tr("Select Faces From Edges")); connect(selectFacesFromEdges, SIGNAL(triggered()), this, SLOT(SelectFacesFromEdges())); /* Select Vertices */ /* Unfold MENU */ onePiece = new QAction(tr("One Piece - Random"), this); onePiece->setStatusTip(tr("Unfold to one piece")); connect(onePiece, SIGNAL(triggered()), this, SLOT(createScaleDialog())); usingSelectionAsConnectors = new QAction(tr("Using Selection as connectors"), this); usingSelectionAsConnectors ->setStatusTip(tr("Using Selection as connectors")); connect(usingSelectionAsConnectors , SIGNAL(triggered()), this, SLOT(UseSelectionAsConnectors ())); usingSelectionAsFlaps= new QAction(tr("Using Selection as connectors"), this); usingSelectionAsFlaps->setStatusTip(tr("Using Selection as connectors")); connect(usingSelectionAsFlaps, SIGNAL(triggered()), this, SLOT(UseSelectionAsFlaps())); /* Display MENU */ // show Original viewOriginal = new QAction(tr("Display Original"), this); viewOriginal->setStatusTip(tr("Display Original OBJ file")); viewOriginal->setCheckable(true); viewOriginal->setChecked(true); connect(viewOriginal, SIGNAL(triggered()), this, SLOT(ShowOriginal())); //Show Folded viewFolded = new QAction(tr("Display Folded"), this); viewFolded->setStatusTip(tr("Display Folded OBJ file")); viewFolded->setCheckable(true); viewFolded->setChecked(true); connect(viewFolded, SIGNAL(triggered()), this, SLOT(ShowFolded())); //Show unFolded viewUnfolded= new QAction(tr("Display UnFolded"), this); viewUnfolded->setStatusTip(tr("Display UnFolded OBJ file")); viewUnfolded->setCheckable(true); viewUnfolded->setChecked(true); connect(viewUnfolded, SIGNAL(triggered()), this, SLOT(ShowUnfolded())); //Show Triangle viewTriangle= new QAction(tr("Display UnFolded"), this); viewTriangle->setStatusTip(tr("Display UnFolded OBJ file")); viewTriangle->setCheckable(true); viewTriangle->setChecked(true); connect(viewTriangle, SIGNAL(triggered()), this, SLOT(ShowTriangle())); /* Flap Types MENU */ // Use Flap type 1 flapType1 = new QAction(QIcon(":/images/flapTypes/flapType1.png"), tr("Flap Type 1"), this); flapType1->setStatusTip(tr("Use Flap type 1")); flapType1->setCheckable(true); flapType1->setChecked(true); connect(flapType1, SIGNAL(triggered()), this, SLOT(FlapType1())); // Use Flap type 2 flapType2 = new QAction(QIcon(":/images/flapTypes/flapType2.png"), tr("Flap Type 2"), this); flapType2->setStatusTip(tr("Use Flap type 2")); flapType2->setCheckable(true); flapType2->setChecked(true); connect(flapType2, SIGNAL(triggered()), this, SLOT(FlapType2())); // Use Flap type 3 flapType3 = new QAction(QIcon(":/images/flapTypes/flapType3.png"), tr("Flap Type 3"), this); flapType3->setStatusTip(tr("Use Flap type 3")); flapType3->setCheckable(true); flapType3->setChecked(true); connect(flapType3, SIGNAL(triggered()), this, SLOT(FlapType3())); // Use Flap type 4 flapType4 = new QAction(QIcon(":/images/flapTypes/flapType4.png"), tr("Flap Type 4"), this); flapType4->setStatusTip(tr("Use Flap type 4")); flapType4->setCheckable(true); flapType4->setChecked(true); connect(flapType4, SIGNAL(triggered()), this, SLOT(FlapType4())); /* Helps MENU */ // About QT aboutQtAct = new QAction(tr("About &Qt"), this); aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); connect(aboutQtAct, SIGNAL(triggered()), this, SLOT(about())); }