/* MapArchClipboardItem::pasteToMap * Pastes copied architecture to [map] at [position] *******************************************************************/ vector<MapVertex*> MapArchClipboardItem::pasteToMap(SLADEMap* map, fpoint2_t position) { std::map<MapVertex*, MapVertex*> vertMap; std::map<MapSector*, MapSector*> sectMap; std::map<MapSide*, MapSide*> sideMap; // Not used yet... // std::map<MapLine*, MapLine*> lineMap; // Add vertices vector<MapVertex*> new_verts; for (unsigned a = 0; a < vertices.size(); a++) { new_verts.push_back(map->createVertex(position.x + vertices[a]->xPos(), position.y + vertices[a]->yPos())); new_verts.back()->copy(vertices[a]); vertMap[vertices[a]] = new_verts.back(); } // Add sectors for (unsigned a = 0; a < sectors.size(); a++) { MapSector* new_sector = map->createSector(); new_sector->copy(sectors[a]); sectMap[sectors[a]] = new_sector; } // Add sides int first_new_side = map->nSides(); for (unsigned a = 0; a < sides.size(); a++) { // Get relative sector MapSector* sector = findInMap(sectMap, sides[a]->getSector()); MapSide* new_side = map->createSide(sector); new_side->copy(sides[a]); sideMap[sides[a]] = new_side; } // Add lines int first_new_line = map->nLines(); for (unsigned a = 0; a < lines.size(); a++) { // Get relative vertices MapVertex* v1 = findInMap(vertMap, lines[a]->v1()); MapVertex* v2 = findInMap(vertMap, lines[a]->v2()); if (!v1) { wxLogMessage("no v1"); continue; } if (!v2) { wxLogMessage("no v2"); } MapLine* newline = map->createLine(v1, v2, true); newline->copy(lines[a]); // lineMap[lines[a]] = newline; // Set relative sides bool s1 = false; bool s2 = !(lines[a]->s2()); MapSide* newS1 = findInMap(sideMap, lines[a]->s1()); MapSide* newS2 = findInMap(sideMap, lines[a]->s2()); if(newS1) newline->setS1(newS1); if(newS2) newline->setS2(newS2); // Set important flags (needed when copying from Doom/Hexen format to UDMF) // Won't be needed when proper map format conversion stuff is implemented theGameConfiguration->setLineBasicFlag( "twosided", newline, map->currentFormat(), (newS1 && newS2) ); theGameConfiguration->setLineBasicFlag( "blocking", newline, map->currentFormat(), !newS2 ); } // TODO: // - Split lines // - Merge lines //// Fix sector references //// TODO: figure out what lines are 'outside' on copy, only fix said lines //for (unsigned a = first_new_line; a < map->nLines(); a++) //{ // MapLine* line = map->getLine(a); // MapSector* sec1 = map->getLineSideSector(line, true); // MapSector* sec2 = map->getLineSideSector(line, false); // int i1 = -1; // int i2 = -2; // if (sec1) i1 = sec1->getIndex(); // if (sec2) i2 = sec2->getIndex(); // map->setLineSector(a, i1, true); // map->setLineSector(a, i2, false); //} return new_verts; }
/* MapArchClipboardItem::pasteToMap * Pastes copied architecture to [map] at [position] *******************************************************************/ vector<MapVertex*> MapArchClipboardItem::pasteToMap(SLADEMap* map, fpoint2_t position) { std::map<MapVertex*, MapVertex*> vertMap; std::map<MapSector*, MapSector*> sectMap; std::map<MapSide*, MapSide*> sideMap; // Not used yet... // std::map<MapLine*, MapLine*> lineMap; // Add vertices vector<MapVertex*> new_verts; for (unsigned a = 0; a < vertices.size(); a++) { new_verts.push_back(map->createVertex(position.x + vertices[a]->xPos(), position.y + vertices[a]->yPos())); new_verts.back()->copy(vertices[a]); vertMap[vertices[a]] = new_verts.back(); } // Add sectors for (unsigned a = 0; a < sectors.size(); a++) { MapSector* new_sector = map->createSector(); new_sector->copy(sectors[a]); sectMap[sectors[a]] = new_sector; } // Add sides int first_new_side = map->nSides(); for (unsigned a = 0; a < sides.size(); a++) { // Get relative sector MapSector* sector = findInMap(sectMap, sides[a]->getSector()); MapSide* new_side = map->createSide(sector); new_side->copy(sides[a]); sideMap[sides[a]] = new_side; } // Add lines int first_new_line = map->nLines(); for (unsigned a = 0; a < lines.size(); a++) { // Get relative vertices MapVertex* v1 = findInMap(vertMap, lines[a]->v1()); MapVertex* v2 = findInMap(vertMap, lines[a]->v2()); if (!v1) { wxLogMessage("no v1"); continue; } if (!v2) { wxLogMessage("no v2"); } MapLine* newline = map->createLine(v1, v2, true); newline->copy(lines[a]); // lineMap[lines[a]] = newline; // Set relative sides bool s1 = false; bool s2 = !(lines[a]->s2()); MapSide* newS1 = findInMap(sideMap, lines[a]->s1()); MapSide* newS2 = findInMap(sideMap, lines[a]->s2()); if(newS1) newline->setS1(newS1); if(newS2) newline->setS2(newS2); } // TODO: // - Split lines // - Merge lines // Fix sector references // TODO: figure out what lines are 'outside' on copy, only fix said lines for (unsigned a = first_new_line; a < map->nLines(); a++) { MapLine* line = map->getLine(a); MapSector* sec1 = map->getLineSideSector(line, true); MapSector* sec2 = map->getLineSideSector(line, false); int i1 = -1; int i2 = -2; if (sec1) i1 = sec1->getIndex(); if (sec2) i2 = sec2->getIndex(); map->setLineSector(a, i1, true); map->setLineSector(a, i2, false); } return new_verts; }