Nudge code working for nudge that is greater than or equal to leaf size.

This commit is contained in:
LionTurtle 2013-09-05 11:06:12 -07:00
parent 62b29d26d2
commit 6e37bc3644
7 changed files with 113 additions and 16 deletions

View file

@ -130,7 +130,8 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_bytesPerSecond(0), _bytesPerSecond(0),
_bytesCount(0), _bytesCount(0),
_swatch(NULL), _swatch(NULL),
_pasteMode(false) _pasteMode(false),
_nudgeCount(0)
{ {
_applicationStartupTime = startup_time; _applicationStartupTime = startup_time;
_window->setWindowTitle("Interface"); _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() { void Application::setListenModeNormal() {
_audio.setListenMode(AudioRingBuffer::NORMAL); _audio.setListenMode(AudioRingBuffer::NORMAL);
} }
@ -1543,9 +1588,11 @@ void Application::update(float deltaTime) {
hoveredNode->setColor(_hoverVoxelOriginalColor); hoveredNode->setColor(_hoverVoxelOriginalColor);
_isHoverVoxelSounding = false; _isHoverVoxelSounding = false;
} }
glm::vec3 nudgeVec(1, 1, 1); // if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) {
_voxels.getVoxelTree()->nudgeSubTree(hoveredNode, nudgeVec); // nudgeVoxels();
// qDebug("nudge called!\n"); // _nudgeCount++;
// qDebug("nudgeCount = %d\n", _nudgeCount);
// }
} else { } else {
// Voxel is not found, clear all // Voxel is not found, clear all
_isHoverVoxelSounding = false; _isHoverVoxelSounding = false;
@ -1637,7 +1684,7 @@ void Application::update(float deltaTime) {
_mouseVoxel.red = 255; _mouseVoxel.red = 255;
_mouseVoxel.green = _mouseVoxel.blue = 0; _mouseVoxel.green = _mouseVoxel.blue = 0;
} else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { } else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) {
// yellow indicates deletion // yellow indicates selection
_mouseVoxel.red = _mouseVoxel.green = 255; _mouseVoxel.red = _mouseVoxel.green = 255;
_mouseVoxel.blue = 0; _mouseVoxel.blue = 0;
} else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked() } else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked()

View file

@ -142,6 +142,7 @@ public slots:
void cutVoxels(); void cutVoxels();
void copyVoxels(); void copyVoxels();
void pasteVoxels(); void pasteVoxels();
void nudgeVoxels();
void setRenderVoxels(bool renderVoxels); void setRenderVoxels(bool renderVoxels);
void doKillLocalVoxels(); void doKillLocalVoxels();
@ -352,6 +353,8 @@ private:
NodeToJurisdictionMap _voxelServerJurisdictions; NodeToJurisdictionMap _voxelServerJurisdictions;
std::vector<VoxelFade> _voxelFades; std::vector<VoxelFade> _voxelFades;
int _nudgeCount;
}; };
#endif /* defined(__interface__Application__) */ #endif /* defined(__interface__Application__) */

View file

@ -249,6 +249,7 @@ Menu::Menu() :
addActionToQMenuAndActionHash(voxelMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels())); 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::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels()));
addActionToQMenuAndActionHash(voxelMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); 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"); QMenu* debugMenu = addMenu("Debug");

View file

@ -158,6 +158,7 @@ namespace MenuOption {
const QString LookAtVectors = "Look-at Vectors"; const QString LookAtVectors = "Look-at Vectors";
const QString LowRes = "Lower Resolution While Moving"; const QString LowRes = "Lower Resolution While Moving";
const QString Mirror = "Mirror"; const QString Mirror = "Mirror";
const QString NudgeVoxels = "Nudge Voxels";
const QString OcclusionCulling = "Occlusion Culling"; const QString OcclusionCulling = "Occlusion Culling";
const QString Oscilloscope = "Audio Oscilloscope"; const QString Oscilloscope = "Audio Oscilloscope";
const QString Pair = "Pair"; const QString Pair = "Pair";

View file

@ -12,6 +12,7 @@
#define __shared__VoxelEditPacketSender__ #define __shared__VoxelEditPacketSender__
#include <PacketSender.h> #include <PacketSender.h>
#include <PacketHeaders.h>
#include <SharedUtil.h> // for VoxelDetail #include <SharedUtil.h> // for VoxelDetail
#include "JurisdictionMap.h" #include "JurisdictionMap.h"

View file

@ -31,6 +31,7 @@
#include "VoxelConstants.h" #include "VoxelConstants.h"
#include "VoxelNodeBag.h" #include "VoxelNodeBag.h"
#include "VoxelTree.h" #include "VoxelTree.h"
#include <PacketHeaders.h>
float boundaryDistanceForRenderLevel(unsigned int renderLevel) { float boundaryDistanceForRenderLevel(unsigned int renderLevel) {
return ::VOXEL_SIZE_SCALE / powf(2, renderLevel); return ::VOXEL_SIZE_SCALE / powf(2, renderLevel);
@ -1912,11 +1913,20 @@ void VoxelTree::cancelImport() {
_stopImport = true; _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 { class NodeChunkArgs {
public: public:
VoxelTree* thisVoxelTree; VoxelTree* thisVoxelTree;
float newSize; float newSize;
glm::vec3 nudgeVec; glm::vec3 nudgeVec;
VoxelEditPacketSender* voxelEditSenderPtr;
int colorIndex;
}; };
bool VoxelTree::nudgeCheck(VoxelNode* node, void* extraData) { bool VoxelTree::nudgeCheck(VoxelNode* node, void* extraData) {
@ -1943,20 +1953,31 @@ bool VoxelTree::nudgeCheck(VoxelNode* node, void* extraData) {
return false; return false;
} else { } else {
// break the current leaf into smaller chunks // break the current leaf into smaller chunks
args->thisVoxelTree->chunkifyLeaf(node); args->thisVoxelTree->chunkifyLeaf(node, extraData);
} }
} }
return true; return true;
} }
void VoxelTree::chunkifyLeaf(VoxelNode* node) { void VoxelTree::chunkifyLeaf(VoxelNode* node, void* extraData) {
// because this function will continue being called recursively // because this function will continue being called recursively
// we only need to worry about breaking this specific leaf down // 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++) { for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
node->addChildAtIndex(i); node->addChildAtIndex(i);
if (node->isColored()) { if (args->colorIndex == 0) {
node->getChildAtIndex(i)->setColor(node->getColor()); 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 // get voxel position/size
VoxelPositionSize unNudgedDetails; VoxelPositionSize unNudgedDetails;
voxelDetailsForCode(octalCode, 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 // 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"); qDebug("unNudged voxel deleted!\n");
// create a new voxel in its stead // 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); 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, // 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); // 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, voxelDetails.x = unNudgedDetails.x + nudge.x;
0, 0, 0, true); voxelDetails.y = unNudgedDetails.y + nudge.y;
qDebug("nudged voxel created!\n"); 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 // calculate minNudgeAmount to check if breaking the tree into smaller chunks is necessary
float minNudgeAmount = fmin(nudgeAmount.x, nudgeAmount.y); float minNudgeAmount = fmin(nudgeAmount.x, nudgeAmount.y);
minNudgeAmount = fmin(minNudgeAmount, nudgeAmount.z); minNudgeAmount = fmin(minNudgeAmount, nudgeAmount.z);
@ -1995,6 +2036,8 @@ void VoxelTree::nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmoun
args.thisVoxelTree = this; args.thisVoxelTree = this;
args.newSize = minNudgeAmount; args.newSize = minNudgeAmount;
args.nudgeVec = nudgeAmount; args.nudgeVec = nudgeAmount;
args.voxelEditSenderPtr = &voxelEditSender;
args.colorIndex = 0;
recurseNodeWithOperation(nodeToNudge, nudgeCheck, &args); recurseNodeWithOperation(nodeToNudge, nudgeCheck, &args);
} }

View file

@ -19,6 +19,7 @@
#include "VoxelNode.h" #include "VoxelNode.h"
#include "VoxelNodeBag.h" #include "VoxelNodeBag.h"
#include "VoxelSceneStats.h" #include "VoxelSceneStats.h"
#include "VoxelEditPacketSender.h"
#include <QObject> #include <QObject>
@ -195,7 +196,7 @@ public:
RecurseVoxelTreeOperation operation, RecurseVoxelTreeOperation operation,
const glm::vec3& point, void* extraData); 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: signals:
void importSize(float x, float y, float z); void importSize(float x, float y, float z);
@ -260,7 +261,7 @@ private:
// helper functions for nudgeSubTree // helper functions for nudgeSubTree
static bool nudgeCheck(VoxelNode* node, void* extraData); static bool nudgeCheck(VoxelNode* node, void* extraData);
void nudgeLeaf(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); float boundaryDistanceForRenderLevel(unsigned int renderLevel);