bool Polygon2D::openSector(MapSector* sector) { // Check sector was given if (!sector) return false; // Init PolygonSplitter splitter; clear(); // Get list of sides connected to this sector vector<MapSide*>& sides = sector->connectedSides(); // Go through sides MapLine* line; for (unsigned a = 0; a < sides.size(); a++) { line = sides[a]->getParentLine(); // Ignore this side if its parent line has the same sector on both sides if (!line || line->doubleSector()) continue; // Add the edge to the splitter (direction depends on what side of the line this is) if (line->s1() == sides[a]) splitter.addEdge(line->v1()->xPos(), line->v1()->yPos(), line->v2()->xPos(), line->v2()->yPos()); else splitter.addEdge(line->v2()->xPos(), line->v2()->yPos(), line->v1()->xPos(), line->v1()->yPos()); } // Split the polygon into convex sub-polygons return splitter.doSplitting(this); }
/* MapCanvas::onKeyDown * Called when a key is pressed within the canvas *******************************************************************/ void MapCanvas::onKeyDown(wxKeyEvent& e) { // Send to editor context_->input().updateKeyModifiersWx(e.GetModifiers()); context_->input().keyDown(KeyBind::keyName(e.GetKeyCode())); // Testing if (Global::debug) { if (e.GetKeyCode() == WXK_F6) { Polygon2D poly; sf::Clock clock; LOG_MESSAGE(1, "Generating polygons..."); for (unsigned a = 0; a < context_->map().nSectors(); a++) { if (!poly.openSector(context_->map().getSector(a))) LOG_MESSAGE(1, "Splitting failed for sector %d", a); } //int ms = clock.GetElapsedTime() * 1000; //LOG_MESSAGE(1, "Polygon generation took %dms", ms); } if (e.GetKeyCode() == WXK_F7) { // Get nearest line int nearest = context_->map().nearestLine(context_->input().mousePosMap(), 999999); MapLine* line = context_->map().getLine(nearest); if (line) { SectorBuilder sbuilder; // Determine line side double side = MathStuff::lineSide(context_->input().mousePosMap(), line->seg()); if (side >= 0) sbuilder.traceSector(&(context_->map()), line, true); else sbuilder.traceSector(&(context_->map()), line, false); } } if (e.GetKeyCode() == WXK_F5) { // Get nearest line int nearest = context_->map().nearestLine(context_->input().mousePosMap(), 999999); MapLine* line = context_->map().getLine(nearest); // Get sectors MapSector* sec1 = context_->map().getLineSideSector(line, true); MapSector* sec2 = context_->map().getLineSideSector(line, false); int i1 = -1; int i2 = -1; if (sec1) i1 = sec1->getIndex(); if (sec2) i2 = sec2->getIndex(); context_->addEditorMessage(S_FMT("Front %d Back %d", i1, i2)); } if (e.GetKeyCode() == WXK_F5 && context_->editMode() == Mode::Sectors) { PolygonSplitter splitter; splitter.setVerbose(true); splitter.openSector(context_->selection().hilightedSector()); Polygon2D temp; splitter.doSplitting(&temp); } } // Update cursor in object edit mode //if (mouse_state == Input::MouseState::ObjectEdit) // determineObjectEditState(); #ifndef __WXMAC__ // Skipping events on OS X doesn't do anything but causes // sound alert (a.k.a. error beep) on every key press if (e.GetKeyCode() != WXK_UP && e.GetKeyCode() != WXK_DOWN && e.GetKeyCode() != WXK_LEFT && e.GetKeyCode() != WXK_RIGHT && e.GetKeyCode() != WXK_NUMPAD_UP && e.GetKeyCode() != WXK_NUMPAD_DOWN && e.GetKeyCode() != WXK_NUMPAD_LEFT && e.GetKeyCode() != WXK_NUMPAD_RIGHT) e.Skip(); #endif // !__WXMAC__ }