mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 17:00:13 +02:00
Switching nudge to cut/paste implementation. Preliminary.
This commit is contained in:
parent
59943dc2e8
commit
d965789812
5 changed files with 59 additions and 40 deletions
|
@ -1287,22 +1287,52 @@ void Application::pasteVoxels() {
|
||||||
|
|
||||||
void Application::nudgeVoxels() {
|
void Application::nudgeVoxels() {
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) {
|
||||||
|
cutVoxels();
|
||||||
|
unsigned char* calculatedOctCode = NULL;
|
||||||
VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s);
|
VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s);
|
||||||
|
|
||||||
if (selectedNode) {
|
// Recurse the clipboard tree, where everything is root relative, and send all the colored voxels to
|
||||||
// glPushMatrix();
|
// the server as an set voxel message, this will also rebase the voxels to the new location
|
||||||
// glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE);
|
SendVoxelsOperationArgs args;
|
||||||
// renderNudgeGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s);
|
|
||||||
// glPopMatrix();
|
|
||||||
qDebug("UnNudged xyz: %f, %f, %f\n", _mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z);
|
|
||||||
|
|
||||||
// nudge the node
|
// we only need the selected voxel to get the newBaseOctCode, which we can actually calculate from the
|
||||||
// glm::vec3 nudgeVec(_mouseVoxel.s, _mouseVoxel.s, _mouseVoxel.s);
|
// voxel size/position details. If we don't have an actual selectedNode then use the mouseVoxel to create a
|
||||||
// glm::vec3 nudgeVec(0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s);
|
// target octalCode for where the user is pointing.
|
||||||
glm::vec3 nudgeVec(0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s);
|
if (selectedNode) {
|
||||||
_voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender);
|
args.newBaseOctCode = selectedNode->getOctalCode();
|
||||||
|
} else {
|
||||||
|
args.newBaseOctCode = calculatedOctCode = pointToVoxel(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s);
|
||||||
|
}
|
||||||
|
|
||||||
|
_sharedVoxelSystem.getTree()->recurseTreeWithOperation(sendVoxelsOperation, &args);
|
||||||
|
glm::vec3 nudgeVec(0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s);
|
||||||
|
_voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender);
|
||||||
|
|
||||||
|
if (_sharedVoxelSystem.getTree() != &_clipboard) {
|
||||||
|
_sharedVoxelSystem.killLocalVoxels();
|
||||||
|
_sharedVoxelSystem.changeTree(&_clipboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
_voxelEditSender.flushQueue();
|
||||||
|
|
||||||
|
if (calculatedOctCode) {
|
||||||
|
delete[] calculatedOctCode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// // nudge the node
|
||||||
|
// // glm::vec3 nudgeVec(_mouseVoxel.s, _mouseVoxel.s, _mouseVoxel.s);
|
||||||
|
// // glm::vec3 nudgeVec(0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s, 0.5 * _mouseVoxel.s);
|
||||||
|
// glm::vec3 nudgeVec(0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s, 0.25 * _mouseVoxel.s);
|
||||||
|
// _voxels.getVoxelTree()->nudgeSubTree(selectedNode, nudgeVec, _voxelEditSender);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setListenModeNormal() {
|
void Application::setListenModeNormal() {
|
||||||
|
@ -2278,10 +2308,10 @@ void Application::displaySide(Camera& whichCamera) {
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE);
|
glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE);
|
||||||
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) {
|
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) {
|
||||||
VoxelNode* selectedNode = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s);
|
// VoxelNode* selectedNode = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s);
|
||||||
if (selectedNode) {
|
// if (selectedNode) {
|
||||||
renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s);
|
renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s);
|
||||||
}
|
// }
|
||||||
} else {
|
} else {
|
||||||
renderMouseVoxelGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s);
|
renderMouseVoxelGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s);
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,6 +108,7 @@ Menu::Menu() :
|
||||||
addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels()));
|
addActionToQMenuAndActionHash(editMenu, MenuOption::CutVoxels, Qt::CTRL | Qt::Key_X, appInstance, SLOT(cutVoxels()));
|
||||||
addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels()));
|
addActionToQMenuAndActionHash(editMenu, MenuOption::CopyVoxels, Qt::CTRL | Qt::Key_C, appInstance, SLOT(copyVoxels()));
|
||||||
addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels()));
|
addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels()));
|
||||||
|
addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels()));
|
||||||
|
|
||||||
addDisabledActionAndSeparator(editMenu, "Physics");
|
addDisabledActionAndSeparator(editMenu, "Physics");
|
||||||
addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true);
|
addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true);
|
||||||
|
@ -132,7 +133,7 @@ Menu::Menu() :
|
||||||
QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B);
|
QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B);
|
||||||
_voxelModeActionsGroup->addAction(colorVoxelMode);
|
_voxelModeActionsGroup->addAction(colorVoxelMode);
|
||||||
|
|
||||||
QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(voxelMenu, MenuOption::VoxelNudgeMode, Qt::Key_N);
|
QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelNudgeMode, Qt::Key_N);
|
||||||
_voxelModeActionsGroup->addAction(nudgeVoxelMode);
|
_voxelModeActionsGroup->addAction(nudgeVoxelMode);
|
||||||
|
|
||||||
QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O);
|
QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O);
|
||||||
|
@ -180,12 +181,6 @@ Menu::Menu() :
|
||||||
appInstance,
|
appInstance,
|
||||||
SLOT(setFullscreen(bool)));
|
SLOT(setFullscreen(bool)));
|
||||||
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true);
|
addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true);
|
||||||
addActionToQMenuAndActionHash(voxelMenu, MenuOption::ExportVoxels, Qt::CTRL | Qt::Key_E, appInstance, SLOT(exportVoxels()));
|
|
||||||
addActionToQMenuAndActionHash(voxelMenu, MenuOption::ImportVoxels, Qt::CTRL | Qt::Key_I, appInstance, SLOT(importVoxels()));
|
|
||||||
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()));
|
|
||||||
|
|
||||||
addActionToQMenuAndActionHash(viewMenu,
|
addActionToQMenuAndActionHash(viewMenu,
|
||||||
MenuOption::IncreaseAvatarSize,
|
MenuOption::IncreaseAvatarSize,
|
||||||
|
|
|
@ -414,28 +414,26 @@ void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, co
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderNudgeGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS) {
|
void renderNudgeGrid(const float& voxelX, const float& voxelY, const float& voxelZ, const float& voxelS) {
|
||||||
glm::vec3 origin = glm::vec3(mouseVoxelX, mouseVoxelY, mouseVoxelZ);
|
glm::vec3 origin = glm::vec3(voxelX, voxelY, voxelZ);
|
||||||
|
|
||||||
glLineWidth(1.0);
|
glLineWidth(1.0);
|
||||||
|
|
||||||
const int GRID_DIMENSIONS = 4;
|
const int GRID_DIMENSIONS = 4;
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
|
|
||||||
for (int i = 0; i <= GRID_DIMENSIONS; i++) {
|
for (int xz = - (GRID_DIMENSIONS / 2); xz <= GRID_DIMENSIONS / 2 + 1; xz++) {
|
||||||
for (int j = -GRID_DIMENSIONS / 2; j <= GRID_DIMENSIONS / 2; j++) {
|
glm::vec3 xColor(0.0, 0.6, 0.0);
|
||||||
glm::vec3 xColor(0.0, 0.6, 0.0);
|
glColor3fv(&xColor.x);
|
||||||
glColor3fv(&xColor.x);
|
|
||||||
|
|
||||||
glVertex3f(origin.x + GRID_DIMENSIONS * mouseVoxelS, i * mouseVoxelS, origin.z + j * mouseVoxelS);
|
glVertex3f(origin.x + GRID_DIMENSIONS * voxelS, 0, origin.z + xz * voxelS);
|
||||||
glVertex3f(origin.x - GRID_DIMENSIONS * mouseVoxelS, i * mouseVoxelS, origin.z + j * mouseVoxelS);
|
glVertex3f(origin.x - (GRID_DIMENSIONS - 1) * voxelS, 0, origin.z + xz * voxelS);
|
||||||
|
|
||||||
glm::vec3 zColor(0.0, 0.0, 0.6);
|
glm::vec3 zColor(0.0, 0.0, 0.6);
|
||||||
glColor3fv(&zColor.x);
|
glColor3fv(&zColor.x);
|
||||||
|
|
||||||
glVertex3f(origin.x + j * mouseVoxelS, i * mouseVoxelS, origin.z + GRID_DIMENSIONS * mouseVoxelS);
|
glVertex3f(origin.x + xz * voxelS, 0, origin.z + GRID_DIMENSIONS * voxelS);
|
||||||
glVertex3f(origin.x + j * mouseVoxelS, i * mouseVoxelS, origin.z - GRID_DIMENSIONS * mouseVoxelS);
|
glVertex3f(origin.x + xz * voxelS, 0, origin.z - (GRID_DIMENSIONS - 1) * voxelS);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ void renderGroundPlaneGrid(float size, float impact);
|
||||||
|
|
||||||
void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS);
|
void renderMouseVoxelGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS);
|
||||||
|
|
||||||
void renderNudgeGrid(const float& mouseVoxelX, const float& mouseVoxelY, const float& mouseVoxelZ, const float& mouseVoxelS);
|
void renderNudgeGrid(const float& voxelX, const float& voxelY, const float& voxelZ, const float& voxelS);
|
||||||
|
|
||||||
void renderCollisionOverlay(int width, int height, float magnitude);
|
void renderCollisionOverlay(int width, int height, float magnitude);
|
||||||
|
|
||||||
|
|
|
@ -190,10 +190,6 @@ public:
|
||||||
void recurseNodeWithOperationDistanceSorted(VoxelNode* node, RecurseVoxelTreeOperation operation,
|
void recurseNodeWithOperationDistanceSorted(VoxelNode* node, RecurseVoxelTreeOperation operation,
|
||||||
const glm::vec3& point, void* extraData);
|
const glm::vec3& point, void* extraData);
|
||||||
|
|
||||||
void recurseTreeWithOperationDistanceSortedTimed(PointerStack* stackOfNodes, long allowedTime,
|
|
||||||
RecurseVoxelTreeOperation operation,
|
|
||||||
const glm::vec3& point, void* extraData);
|
|
||||||
|
|
||||||
void nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount, VoxelEditPacketSender& voxelEditSender);
|
void nudgeSubTree(VoxelNode* nodeToNudge, const glm::vec3& nudgeAmount, VoxelEditPacketSender& voxelEditSender);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
Loading…
Reference in a new issue