Unified · Split
| @@ -1287,22 +1287,52 @@ void Application::pasteVoxels() { · 1286 unmodified lines | ||
| 1287 | 1287 | |
| 1288 | 1288 | void Application::nudgeVoxels() { |
| 1289 | 1289 | if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { |
| 1290 | + cutVoxels(); | |
| 1291 | + unsigned char* calculatedOctCode = NULL; | |
| 1290 | 1292 | VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); |
| 1291 | 1293 | |
| 1294 | + // Recurse the clipboard tree, where everything is root relative, and send all the colored voxels to | |
| 1295 | + // the server as an set voxel message, this will also rebase the voxels to the new location | |
| 1296 | + SendVoxelsOperationArgs args; | |
| 1297 | + | |
| 1298 | + // we only need the selected voxel to get the newBaseOctCode, which we can actually calculate from the | |
| 1299 | + // voxel size/position details. If we don't have an actual selectedNode then use the mouseVoxel to create a | |
| 1300 | + // target octalCode for where the user is pointing. | |
| 1292 | 1301 | if (selectedNode) { |
| 1293 | − // glPushMatrix(); | |
| 1294 | − // glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); | |
| 1295 | − // renderNudgeGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); | |
| 1296 | − // glPopMatrix(); | |
| 1297 | − qDebug("UnNudged xyz: %f, %f, %f\n", _mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); | |
| 1302 | + args.newBaseOctCode = selectedNode->getOctalCode(); | |
| 1303 | + } else { | |
| 1304 | + args.newBaseOctCode = calculatedOctCode = pointToVoxel(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); | |
| 1305 | + } | |
| 1306 | + | |
| 1307 | + _sharedVoxelSystem.getTree()->recurseTreeWithOperation(sendVoxelsOperation, &args); | |
| 1308 | + glm::vec3 nudgeVec(0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s); | |
| 1309 | + _voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender); | |
| 1298 | 1310 | |
| 1299 | − // nudge the node | |
| 1300 | − // glm::vec3 nudgeVec(_mouseVoxel.s, _mouseVoxel.s, _mouseVoxel.s); | |
| 1301 | − // glm::vec3 nudgeVec(0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s); | |
| 1302 | − glm::vec3 nudgeVec(0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s); | |
| 1303 | − _voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender); | |
| 1311 | + if (_sharedVoxelSystem.getTree() != &_clipboard) { | |
| 1312 | + _sharedVoxelSystem.killLocalVoxels(); | |
| 1313 | + _sharedVoxelSystem.changeTree(&_clipboard); | |
| 1314 | + } | |
| 1315 | + | |
| 1316 | + _voxelEditSender.flushQueue(); | |
| 1317 | + | |
| 1318 | + if (calculatedOctCode) { | |
| 1319 | + delete[] calculatedOctCode; | |
| 1304 | 1320 | } |
| 1305 | 1321 | } |
| 1322 | + | |
| 1323 | + | |
| 1324 | + | |
| 1325 | + // VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); | |
| 1326 | + | |
| 1327 | + // if (selectedNode) { | |
| 1328 | + // qDebug("UnNudged xyz: %f, %f, %f\n", _mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); | |
| 1329 | + | |
| 1330 | + // // nudge the node | |
| 1331 | + // // glm::vec3 nudgeVec(_mouseVoxel.s, _mouseVoxel.s, _mouseVoxel.s); | |
| 1332 | + // // glm::vec3 nudgeVec(0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s); | |
| 1333 | + // glm::vec3 nudgeVec(0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s); | |
| 1334 | + // _voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender); | |
| 1335 | + // } | |
| 1306 | 1336 | } |
| 1307 | 1337 | |
| 1308 | 1338 | void Application::setListenModeNormal() { |
| @@ -2278,10 +2308,10 @@ void Application::displaySide(Camera& whichCamera) { · 969 unmodified lines | ||
| 2278 | 2308 | glPushMatrix(); |
| 2279 | 2309 | glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); |
| 2280 | 2310 | if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { |
| 2281 | − VoxelNode* selectedNode = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); | |
| 2282 | − if (selectedNode) { | |
| 2283 | − renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); | |
| 2284 | − } | |
| 2311 | + // VoxelNode* selectedNode = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); | |
| 2312 | + // if (selectedNode) { | |
| 2313 | + renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); | |
| 2314 | + // } | |
| 2285 | 2315 | } else { |
| 2286 | 2316 | renderMouseVoxelGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); |
| 2287 | 2317 | } |
| @@ -108,6 +108,7 @@ Menu::Menu() : · 107 unmodified lines | ||
| 108 | 108 | addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); |
| 109 | 109 | addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels())); |
| 110 | 110 | addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); |
| 111 | + addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels())); | |
| 111 | 112 | |
| 112 | 113 | addDisabledActionAndSeparator(editMenu, "Physics"); |
| 113 | 114 | addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true); |
| @@ -132,7 +133,7 @@ Menu::Menu() : · 18 unmodified lines | ||
| 132 | 133 | QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B); |
| 133 | 134 | _voxelModeActionsGroup->addAction(colorVoxelMode); |
| 134 | 135 | |
| 135 | − QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(voxelMenu, MenuOption::VoxelNudgeMode, Qt::Key_N); | |
| 136 | + QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelNudgeMode, Qt::Key_N); | |
| 136 | 137 | _voxelModeActionsGroup->addAction(nudgeVoxelMode); |
| 137 | 138 | |
| 138 | 139 | QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O); |
| @@ -180,12 +181,6 @@ Menu::Menu() : · 41 unmodified lines | ||
| 180 | 181 | appInstance, |
| 181 | 182 | SLOT(setFullscreen(bool))); |
| 182 | 183 | addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true); |
| 183 | − addActionToQMenuAndActionHash(voxelMenu, MenuOption::ExportVoxels, Qt::CTRL | Qt::Key_E, appInstance, SLOT(exportVoxels())); | |
| 184 | − addActionToQMenuAndActionHash(voxelMenu, MenuOption::ImportVoxels, Qt::CTRL | Qt::Key_I, appInstance, SLOT(importVoxels())); | |
| 185 | − addActionToQMenuAndActionHash(voxelMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); | |
| 186 | − addActionToQMenuAndActionHash(voxelMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels())); | |
| 187 | − addActionToQMenuAndActionHash(voxelMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); | |
| 188 | − addActionToQMenuAndActionHash(voxelMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels())); | |
| 189 | 184 | |
| 190 | 185 | addActionToQMenuAndActionHash(viewMenu, |
| 191 | 186 | MenuOption::IncreaseAvatarSize, |
| @@ -414,28 +414,26 @@ void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, co · 413 unmodified lines | ||
| 414 | 414 | glEnd(); |
| 415 | 415 | } |
| 416 | 416 | |
| 417 | −void renderNudgeGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS) { | |
| 418 | − glm::vec3 origin = glm::vec3(mouseVoxelX, mouseVoxelY, mouseVoxelZ); | |
| 417 | +void renderNudgeGrid(const float& voxelX, const float& voxelY, const float& voxelZ, const float& voxelS) { | |
| 418 | + glm::vec3 origin = glm::vec3(voxelX, voxelY, voxelZ); | |
| 419 | 419 | |
| 420 | 420 | glLineWidth(1.0); |
| 421 | 421 | |
| 422 | 422 | const int GRID_DIMENSIONS = 4; |
| 423 | 423 | glBegin(GL_LINES); |
| 424 | 424 | |
| 425 | − for (int i = 0; i <= GRID_DIMENSIONS; i++) { | |
| 426 | − for (int j = -GRID_DIMENSIONS / 2; j <= GRID_DIMENSIONS / 2; j++) { | |
| 427 | − glm::vec3 xColor(0.0, 0.6, 0.0); | |
| 428 | − glColor3fv(&xColor.x); | |
| 425 | + for (int xz = - (GRID_DIMENSIONS / 2); xz <= GRID_DIMENSIONS / 2 + 1; xz++) { | |
| 426 | + glm::vec3 xColor(0.0, 0.6, 0.0); | |
| 427 | + glColor3fv(&xColor.x); | |
| 429 | 428 | |
| 430 | − glVertex3f(origin.x + GRID_DIMENSIONS * mouseVoxelS, i * mouseVoxelS, origin.z + j * mouseVoxelS); | |
| 431 | − glVertex3f(origin.x - GRID_DIMENSIONS * mouseVoxelS, i * mouseVoxelS, origin.z + j * mouseVoxelS); | |
| 429 | + glVertex3f(origin.x + GRID_DIMENSIONS * voxelS, 0, origin.z + xz * voxelS); | |
| 430 | + glVertex3f(origin.x - (GRID_DIMENSIONS - 1) * voxelS, 0, origin.z + xz * voxelS); | |
| 432 | 431 | |
| 433 | − glm::vec3 zColor(0.0, 0.0, 0.6); | |
| 434 | − glColor3fv(&zColor.x); | |
| 432 | + glm::vec3 zColor(0.0, 0.0, 0.6); | |
| 433 | + glColor3fv(&zColor.x); | |
| 435 | 434 | |
| 436 | − glVertex3f(origin.x + j * mouseVoxelS, i * mouseVoxelS, origin.z + GRID_DIMENSIONS * mouseVoxelS); | |
| 437 | − glVertex3f(origin.x + j * mouseVoxelS, i * mouseVoxelS, origin.z - GRID_DIMENSIONS * mouseVoxelS); | |
| 438 | − } | |
| 435 | + glVertex3f(origin.x + xz * voxelS, 0, origin.z + GRID_DIMENSIONS * voxelS); | |
| 436 | + glVertex3f(origin.x + xz * voxelS, 0, origin.z - (GRID_DIMENSIONS - 1) * voxelS); | |
| 439 | 437 | } |
| 440 | 438 | glEnd(); |
| 441 | 439 | } |
| @@ -61,7 +61,7 @@ void renderGroundPlaneGrid(float size, float impact); · 60 unmodified lines | ||
| 61 | 61 | |
| 62 | 62 | void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS); |
| 63 | 63 | |
| 64 | −void renderNudgeGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS); | |
| 64 | +void renderNudgeGrid(const float& voxelX, const float& voxelY, const float& voxelZ, const float& voxelS); | |
| 65 | 65 | |
| 66 | 66 | void renderCollisionOverlay(int width, int height, float magnitude); |
| 67 | 67 | |
| @@ -190,10 +190,6 @@ public: · 189 unmodified lines | ||
| 190 | 190 | void recurseNodeWithOperationDistanceSorted(VoxelNode* node, RecurseVoxelTreeOperation operation, |
| 191 | 191 | const glm::vec3& point, void* extraData); |
| 192 | 192 | |
| 193 | − void recurseTreeWithOperationDistanceSortedTimed(PointerStack* stackOfNodes, long allowedTime, | |
| 194 | − RecurseVoxelTreeOperation operation, | |
| 195 | − const glm::vec3& point, void* extraData); | |
| 196 | − | |
| 197 | 193 | void nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount, VoxelEditPacketSender& voxelEditSender); |
| 198 | 194 | |
| 199 | 195 | signals: |