From 6e37bc3644c728b044317538bc2e6408b1ef2875 Mon Sep 17 00:00:00 2001 From: LionTurtle Date: Thu, 5 Sep 2013 11:06:12 -0700 Subject: [PATCH] Nudge code working for nudge that is greater than or equal to leaf size. --- interface/src/Application.cpp | 57 ++++++++++++++++-- interface/src/Application.h | 3 + interface/src/Menu.cpp | 1 + interface/src/Menu.h | 1 + libraries/voxels/src/VoxelEditPacketSender.h | 1 + libraries/voxels/src/VoxelTree.cpp | 61 +++++++++++++++++--- libraries/voxels/src/VoxelTree.h | 5 +- 7 files changed, 113 insertions(+), 16 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e22f1c0ccb..b90b8cbe0a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -130,7 +130,8 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _bytesPerSecond(0), _bytesCount(0), _swatch(NULL), - _pasteMode(false) + _pasteMode(false), + _nudgeCount(0) { _applicationStartupTime = startup_time; _window->setWindowTitle("Interface"); @@ -1272,6 +1273,50 @@ void Application::pasteVoxels() { } } +void Application::nudgeVoxels() { + VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); + + if (selectedNode) { + qDebug("UnNudged xyz: %f, %f, %f\n", _mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); + // // clear the clipboard first... + // _clipboard.killLocalVoxels(); + + // nudge the node + glm::vec3 nudgeVec(0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s); + // glm::vec3 nudgeVec(_mouseVoxel.s, _mouseVoxel.s, _mouseVoxel.s); + // _voxelEditSender.sendVoxelEditMessage(PACKET_TYPE_ERASE_VOXEL, _mouseVoxel); + _voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender); + + // if (!selectedNode) { + // qDebug("new node is null\n"); + // } else { + // // get octal code of this node + // unsigned char* octalCode = selectedNode->getOctalCode(); + + // // get voxel position/size + // VoxelPositionSize nudgedDetails; + // voxelDetailsForCode(octalCode, nudgedDetails); + // qDebug("Nudged xyz: %f, %f, %f\n", nudgedDetails.x, nudgedDetails.y, nudgedDetails.z); + // } + + // // then copy onto it + // _voxels.copySubTreeIntoNewTree(selectedNode, &_clipboard, true); + // // deleteVoxelUnderCursor(); + + // // Recurse the clipboard tree, where everything is root relative, and send all the colored voxels to + // // the server as an set voxel message, this will also rebase the voxels to the new location + // SendVoxelsOperationArgs args; + + // // we only need the selected voxel to get the newBaseOctCode, which we can actually calculate from the + // // voxel size/position details. If we don't have an actual selectedNode then use the mouseVoxel to create a + // // target octalCode for where the user is pointing. + // args.newBaseOctCode = selectedNode->getOctalCode(); + + // _clipboard.recurseTreeWithOperation(sendVoxelsOperation, &args); + // _voxelEditSender.flushQueue(); + } +} + void Application::setListenModeNormal() { _audio.setListenMode(AudioRingBuffer::NORMAL); } @@ -1543,9 +1588,11 @@ void Application::update(float deltaTime) { hoveredNode->setColor(_hoverVoxelOriginalColor); _isHoverVoxelSounding = false; } - glm::vec3 nudgeVec(1, 1, 1); - _voxels.getVoxelTree()->nudgeSubTree(hoveredNode, nudgeVec); - // qDebug("nudge called!\n"); + // if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { + // nudgeVoxels(); + // _nudgeCount++; + // qDebug("nudgeCount = %d\n", _nudgeCount); + // } } else { // Voxel is not found, clear all _isHoverVoxelSounding = false; @@ -1637,7 +1684,7 @@ void Application::update(float deltaTime) { _mouseVoxel.red = 255; _mouseVoxel.green = _mouseVoxel.blue = 0; } else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { - // yellow indicates deletion + // yellow indicates selection _mouseVoxel.red = _mouseVoxel.green = 255; _mouseVoxel.blue = 0; } else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked() diff --git a/interface/src/Application.h b/interface/src/Application.h index a88ea3269f..f1c1d53a66 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -142,6 +142,7 @@ public slots: void cutVoxels(); void copyVoxels(); void pasteVoxels(); + void nudgeVoxels(); void setRenderVoxels(bool renderVoxels); void doKillLocalVoxels(); @@ -352,6 +353,8 @@ private: NodeToJurisdictionMap _voxelServerJurisdictions; std::vector _voxelFades; + + int _nudgeCount; }; #endif /* defined(__interface__Application__) */ diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 119f21df60..937ef5b74c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -249,6 +249,7 @@ Menu::Menu() : addActionToQMenuAndActionHash(voxelMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); addActionToQMenuAndActionHash(voxelMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels())); addActionToQMenuAndActionHash(voxelMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); + addActionToQMenuAndActionHash(voxelMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels())); QMenu* debugMenu = addMenu("Debug"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 252c9a8707..6934f09d8f 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -158,6 +158,7 @@ namespace MenuOption { const QString LookAtVectors = "Look-at Vectors"; const QString LowRes = "Lower Resolution While Moving"; const QString Mirror = "Mirror"; + const QString NudgeVoxels = "Nudge Voxels"; const QString OcclusionCulling = "Occlusion Culling"; const QString Oscilloscope = "Audio Oscilloscope"; const QString Pair = "Pair"; diff --git a/libraries/voxels/src/VoxelEditPacketSender.h b/libraries/voxels/src/VoxelEditPacketSender.h index e07bd11baa..bda2c8006d 100644 --- a/libraries/voxels/src/VoxelEditPacketSender.h +++ b/libraries/voxels/src/VoxelEditPacketSender.h @@ -12,6 +12,7 @@ #define __shared__VoxelEditPacketSender__ #include +#include #include // for VoxelDetail #include "JurisdictionMap.h" diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index b06562fa7b..6f125e0d6b 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -31,6 +31,7 @@ #include "VoxelConstants.h" #include "VoxelNodeBag.h" #include "VoxelTree.h" +#include float boundaryDistanceForRenderLevel(unsigned int renderLevel) { return ::VOXEL_SIZE_SCALE / powf(2, renderLevel); @@ -1912,11 +1913,20 @@ void VoxelTree::cancelImport() { _stopImport = true; } +typedef unsigned char nodeColor[4]; + +const nodeColor red = {255, 0, 0, 0}; +const nodeColor green = {0, 255, 0, 0}; +const nodeColor blue = {0, 0, 255, 0}; + class NodeChunkArgs { public: VoxelTree* thisVoxelTree; float newSize; glm::vec3 nudgeVec; + VoxelEditPacketSender* voxelEditSenderPtr; + + int colorIndex; }; bool VoxelTree::nudgeCheck(VoxelNode* node, void* extraData) { @@ -1943,20 +1953,31 @@ bool VoxelTree::nudgeCheck(VoxelNode* node, void* extraData) { return false; } else { // break the current leaf into smaller chunks - args->thisVoxelTree->chunkifyLeaf(node); + args->thisVoxelTree->chunkifyLeaf(node, extraData); } } return true; } -void VoxelTree::chunkifyLeaf(VoxelNode* node) { +void VoxelTree::chunkifyLeaf(VoxelNode* node, void* extraData) { // because this function will continue being called recursively // we only need to worry about breaking this specific leaf down + if (!node->isColored()) { + return; + } + NodeChunkArgs* args = (NodeChunkArgs*)extraData; for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { node->addChildAtIndex(i); - if (node->isColored()) { - node->getChildAtIndex(i)->setColor(node->getColor()); + if (args->colorIndex == 0) { + node->getChildAtIndex(i)->setColor(red); + } else if (args->colorIndex == 1) { + node->getChildAtIndex(i)->setColor(green); + } else if (args->colorIndex == 2) { + node->getChildAtIndex(i)->setColor(blue); } + args->colorIndex++; + args->colorIndex = args->colorIndex % 3; + // node->getChildAtIndex(i)->setColor(node->getColor()); } } @@ -1971,9 +1992,21 @@ void VoxelTree::nudgeLeaf(VoxelNode* node, void* extraData) { // get voxel position/size VoxelPositionSize unNudgedDetails; voxelDetailsForCode(octalCode, unNudgedDetails); + VoxelDetail voxelDetails; + voxelDetails.x = unNudgedDetails.x; + voxelDetails.y = unNudgedDetails.y; + voxelDetails.z = unNudgedDetails.z; + voxelDetails.s = unNudgedDetails.s; + voxelDetails.red = node->getColor()[0]; + qDebug("rgb: %u, %u, %u\n", node->getColor()[0], node->getColor()[1], node->getColor()[2]); + voxelDetails.green = node->getColor()[1]; + voxelDetails.blue = node->getColor()[2]; + + qDebug("UnNudged xyz: %f, %f, %f\n", unNudgedDetails.x, unNudgedDetails.y, unNudgedDetails.z); // delete the old node - deleteVoxelAt(unNudgedDetails.x, unNudgedDetails.y, unNudgedDetails.z, unNudgedDetails.s); + args->voxelEditSenderPtr->sendVoxelEditMessage(PACKET_TYPE_ERASE_VOXEL, voxelDetails); + // deleteVoxelAt(unNudgedDetails.x, unNudgedDetails.y, unNudgedDetails.z, unNudgedDetails.s); qDebug("unNudged voxel deleted!\n"); // create a new voxel in its stead @@ -1981,12 +2014,20 @@ void VoxelTree::nudgeLeaf(VoxelNode* node, void* extraData) { qDebug("nudged by %f, %f, %f\n", nudge.x, nudge.y, nudge.z); // createVoxel(unNudgedDetails.x + nudge.x, unNudgedDetails.y + nudge.y, unNudgedDetails.z + nudge.z, unNudgedDetails.s, // node->getColor()[0], node->getColor()[1], node->getColor()[2], true); - createVoxel(unNudgedDetails.x + nudge.x, unNudgedDetails.y + nudge.y, unNudgedDetails.z + nudge.z, unNudgedDetails.s, - 0, 0, 0, true); - qDebug("nudged voxel created!\n"); + voxelDetails.x = unNudgedDetails.x + nudge.x; + voxelDetails.y = unNudgedDetails.y + nudge.y; + voxelDetails.z = unNudgedDetails.z + nudge.z; + qDebug("Nudged xyz: %f, %f, %f\n", voxelDetails.x, voxelDetails.y, voxelDetails.z); + args->voxelEditSenderPtr->sendVoxelEditMessage(PACKET_TYPE_SET_VOXEL, voxelDetails); + // unsigned char* newOctalCode = pointToVoxel(unNudgedDetails.x + nudge.x, unNudgedDetails.y + nudge.y, unNudgedDetails.z + nudge.z, + // unNudgedDetails.s, node->getColor()[0], node->getColor()[1], node->getColor()[2]); + + // // node = new VoxelNode(newOctalCode); + // node = NULL; + qDebug("nudged node created!\n"); } -void VoxelTree::nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount) { +void VoxelTree::nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount, VoxelEditPacketSender& voxelEditSender) { // calculate minNudgeAmount to check if breaking the tree into smaller chunks is necessary float minNudgeAmount = fmin(nudgeAmount.x, nudgeAmount.y); minNudgeAmount = fmin(minNudgeAmount, nudgeAmount.z); @@ -1995,6 +2036,8 @@ void VoxelTree::nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmoun args.thisVoxelTree = this; args.newSize = minNudgeAmount; args.nudgeVec = nudgeAmount; + args.voxelEditSenderPtr = &voxelEditSender; + args.colorIndex = 0; recurseNodeWithOperation(nodeToNudge, nudgeCheck, &args); } diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index 396edcc542..b684c96923 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -19,6 +19,7 @@ #include "VoxelNode.h" #include "VoxelNodeBag.h" #include "VoxelSceneStats.h" +#include "VoxelEditPacketSender.h" #include @@ -195,7 +196,7 @@ public: RecurseVoxelTreeOperation operation, const glm::vec3& point, void* extraData); - void nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount); + void nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount, VoxelEditPacketSender& voxelEditSender); signals: void importSize(float x, float y, float z); @@ -260,7 +261,7 @@ private: // helper functions for nudgeSubTree static bool nudgeCheck(VoxelNode* node, void* extraData); void nudgeLeaf(VoxelNode* node, void* extraData); - void chunkifyLeaf(VoxelNode* node); + void chunkifyLeaf(VoxelNode* node, void* extraData); }; float boundaryDistanceForRenderLevel(unsigned int renderLevel);