Unified · Split
| @@ -1287,22 +1287,52 @@ void Application::pasteVoxels() { · 1286 unmodified lines | |||
| 1287 | 1287 | ||
| 1288 | void Application::nudgeVoxels() { | 1288 | void Application::nudgeVoxels() { |
| 1289 | if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { | 1289 | if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { |
| 1290 | cutVoxels(); | ||
| 1291 | unsigned char* calculatedOctCode = NULL; | ||
| 1290 | VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); | 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 | if (selectedNode) { | 1301 | if (selectedNode) { |
| 1293 | // glPushMatrix(); | 1302 | args.newBaseOctCode = selectedNode->getOctalCode(); |
| 1294 | // glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); | 1303 | } else { |
| 1295 | // renderNudgeGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); | 1304 | args.newBaseOctCode = calculatedOctCode = pointToVoxel(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); |
| 1296 | // glPopMatrix(); | 1305 | } |
| 1297 | qDebug("UnNudged xyz: %f, %f, %f\n", _mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); | 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 | 1311 | if (_sharedVoxelSystem.getTree() != &_clipboard) { |
| 1300 | // glm::vec3 nudgeVec(_mouseVoxel.s, _mouseVoxel.s, _mouseVoxel.s); | 1312 | _sharedVoxelSystem.killLocalVoxels(); |
| 1301 | // glm::vec3 nudgeVec(0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s); | 1313 | _sharedVoxelSystem.changeTree(&_clipboard); |
| 1302 | glm::vec3 nudgeVec(0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s); | 1314 | } |
| 1303 | _voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender); | 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 | void Application::setListenModeNormal() { | 1338 | void Application::setListenModeNormal() { |
| @@ -2278,10 +2308,10 @@ void Application::displaySide(Camera& whichCamera) { · 969 unmodified lines | |||
| 2278 | glPushMatrix(); | 2308 | glPushMatrix(); |
| 2279 | glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); | 2309 | glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); |
| 2280 | if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { | 2310 | if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { |
| 2281 | VoxelNode* selectedNode = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); | 2311 | // VoxelNode* selectedNode = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); |
| 2282 | if (selectedNode) { | 2312 | // if (selectedNode) { |
| 2283 | renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); | 2313 | renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); |
| 2284 | } | 2314 | // } |
| 2285 | } else { | 2315 | } else { |
| 2286 | renderMouseVoxelGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); | 2316 | renderMouseVoxelGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); |
| 2287 | } | 2317 | } |
| @@ -108,6 +108,7 @@ Menu::Menu() : · 107 unmodified lines | |||
| 108 | addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); | 108 | addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); |
| 109 | addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels())); | 109 | addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels())); |
| 110 | addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); | 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 | addDisabledActionAndSeparator(editMenu, "Physics"); | 113 | addDisabledActionAndSeparator(editMenu, "Physics"); |
| 113 | addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true); | 114 | addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true); |
| @@ -132,7 +133,7 @@ Menu::Menu() : · 18 unmodified lines | |||
| 132 | QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B); | 133 | QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B); |
| 133 | _voxelModeActionsGroup->addAction(colorVoxelMode); | 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 | _voxelModeActionsGroup->addAction(nudgeVoxelMode); | 137 | _voxelModeActionsGroup->addAction(nudgeVoxelMode); |
| 137 | 138 | ||
| 138 | QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O); | 139 | QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O); |
| @@ -180,12 +181,6 @@ Menu::Menu() : · 41 unmodified lines | |||
| 180 | appInstance, | 181 | appInstance, |
| 181 | SLOT(setFullscreen(bool))); | 182 | SLOT(setFullscreen(bool))); |
| 182 | addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true); | 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 | addActionToQMenuAndActionHash(viewMenu, | 185 | addActionToQMenuAndActionHash(viewMenu, |
| 191 | MenuOption::IncreaseAvatarSize, | 186 | MenuOption::IncreaseAvatarSize, |
| @@ -414,28 +414,26 @@ void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, co · 413 unmodified lines | |||
| 414 | glEnd(); | 414 | glEnd(); |
| 415 | } | 415 | } |
| 416 | 416 | ||
| 417 | void renderNudgeGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS) { | 417 | void renderNudgeGrid(const float& voxelX, const float& voxelY, const float& voxelZ, const float& voxelS) { |
| 418 | glm::vec3 origin = glm::vec3(mouseVoxelX, mouseVoxelY, mouseVoxelZ); | 418 | glm::vec3 origin = glm::vec3(voxelX, voxelY, voxelZ); |
| 419 | 419 | ||
| 420 | glLineWidth(1.0); | 420 | glLineWidth(1.0); |
| 421 | 421 | ||
| 422 | const int GRID_DIMENSIONS = 4; | 422 | const int GRID_DIMENSIONS = 4; |
| 423 | glBegin(GL_LINES); | 423 | glBegin(GL_LINES); |
| 424 | 424 | ||
| 425 | for (int i = 0; i <= GRID_DIMENSIONS; i++) { | 425 | for (int xz = - (GRID_DIMENSIONS / 2); xz <= GRID_DIMENSIONS / 2 + 1; xz++) { |
| 426 | for (int j = -GRID_DIMENSIONS / 2; j <= GRID_DIMENSIONS / 2; j++) { | 426 | glm::vec3 xColor(0.0, 0.6, 0.0); |
| 427 | glm::vec3 xColor(0.0, 0.6, 0.0); | 427 | glColor3fv(&xColor.x); |
| 428 | glColor3fv(&xColor.x); | ||
| 429 | 428 | ||
| 430 | glVertex3f(origin.x + GRID_DIMENSIONS * mouseVoxelS, i * mouseVoxelS, origin.z + j * mouseVoxelS); | 429 | glVertex3f(origin.x + GRID_DIMENSIONS * voxelS, 0, origin.z + xz * voxelS); |
| 431 | glVertex3f(origin.x - GRID_DIMENSIONS * mouseVoxelS, i * mouseVoxelS, origin.z + j * mouseVoxelS); | 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); | 432 | glm::vec3 zColor(0.0, 0.0, 0.6); |
| 434 | glColor3fv(&zColor.x); | 433 | glColor3fv(&zColor.x); |
| 435 | 434 | ||
| 436 | glVertex3f(origin.x + j * mouseVoxelS, i * mouseVoxelS, origin.z + GRID_DIMENSIONS * mouseVoxelS); | 435 | glVertex3f(origin.x + xz * voxelS, 0, origin.z + GRID_DIMENSIONS * voxelS); |
| 437 | glVertex3f(origin.x + j * mouseVoxelS, i * mouseVoxelS, origin.z - GRID_DIMENSIONS * mouseVoxelS); | 436 | glVertex3f(origin.x + xz * voxelS, 0, origin.z - (GRID_DIMENSIONS - 1) * voxelS); |
| 438 | } | ||
| 439 | } | 437 | } |
| 440 | glEnd(); | 438 | glEnd(); |
| 441 | } | 439 | } |
| @@ -61,7 +61,7 @@ void renderGroundPlaneGrid(float size, float impact); · 60 unmodified lines | |||
| 61 | 61 | ||
| 62 | void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS); | 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 | void renderCollisionOverlay(int width, int height, float magnitude); | 66 | void renderCollisionOverlay(int width, int height, float magnitude); |
| 67 | 67 | ||
| @@ -190,10 +190,6 @@ public: · 189 unmodified lines | |||
| 190 | void recurseNodeWithOperationDistanceSorted(VoxelNode* node, RecurseVoxelTreeOperation operation, | 190 | void recurseNodeWithOperationDistanceSorted(VoxelNode* node, RecurseVoxelTreeOperation operation, |
| 191 | const glm::vec3& point, void* extraData); | 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 | void nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount, VoxelEditPacketSender& voxelEditSender); | 193 | void nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount, VoxelEditPacketSender& voxelEditSender); |
| 198 | 194 | ||
| 199 | signals: | 195 | signals: |