From 24531fdd107a720236fa6b74cf3f53bb85f4cc0b Mon Sep 17 00:00:00 2001 From: atlante45 Date: Mon, 19 Aug 2013 15:54:51 -0700 Subject: [PATCH] Dialogbox for import fully functionnal --- interface/src/Application.cpp | 24 +++-- interface/src/Application.h | 2 +- interface/src/ImportDialog.cpp | 136 ++++++++++++++++++++++------- interface/src/ImportDialog.h | 15 +++- interface/src/Menu.cpp | 7 +- interface/src/VoxelImporter.cpp | 119 ++++++++++++++++++++----- interface/src/VoxelImporter.h | 23 +++-- interface/src/VoxelSystem.cpp | 7 ++ interface/src/VoxelSystem.h | 8 +- libraries/voxels/src/Tags.cpp | 4 +- libraries/voxels/src/VoxelTree.cpp | 14 +++ libraries/voxels/src/VoxelTree.h | 2 +- 12 files changed, 275 insertions(+), 86 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a9364a68d2..4d5e548f17 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1199,13 +1199,13 @@ void Application::importVoxelsToClipboard() { QByteArray fileNameAscii = fileNameString.toLocal8Bit(); const char* fileName = fileNameAscii.data(); - _clipboardTree.eraseAllVoxels(); + _clipboard.killLocalVoxels(); if (fileNameString.endsWith(".png", Qt::CaseInsensitive)) { - _clipboardTree.readFromSquareARGB32Pixels(fileName); + _clipboard.readFromSquareARGB32Pixels(fileName); } else if (fileNameString.endsWith(".svo", Qt::CaseInsensitive)) { - _clipboardTree.readFromSVOFile(fileName); + _clipboard.readFromSVOFile(fileName); } else if (fileNameString.endsWith(".schematic", Qt::CaseInsensitive)) { - _clipboardTree.readFromSchematicFile(fileName); + _clipboard.readFromSchematicFile(fileName); } // restore the main window's active state @@ -1213,6 +1213,16 @@ void Application::importVoxelsToClipboard() { } void Application::importVoxels() { + if (_voxelImporter.exec()) { + qDebug("[DEBUG] Import succedded.\n"); + + + } else { + qDebug("[DEBUG] Import failed.\n"); + } + + return; + QString desktopLocation = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QStringList fileNameStringList = QFileDialog::getOpenFileNames(_glWidget, tr("Import Voxels"), desktopLocation, @@ -1369,10 +1379,10 @@ void Application::copyVoxels() { VoxelNode* selectedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); if (selectedNode) { // clear the clipboard first... - _clipboardTree.eraseAllVoxels(); + _clipboard.killLocalVoxels(); // then copy onto it - _voxels.copySubTreeIntoNewTree(selectedNode, &_clipboardTree, true); + //_voxels.copySubTreeIntoNewTree(selectedNode, _clipboard, true); } } @@ -1393,7 +1403,7 @@ void Application::pasteVoxels() { args.newBaseOctCode = calculatedOctCode = pointToVoxel(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); } - _clipboardTree.recurseTreeWithOperation(sendVoxelsOperation, &args); + //_clipboard.recurseTreeWithOperation(sendVoxelsOperation, &args); _voxelEditSender.flushQueue(); if (calculatedOctCode) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 26dcb67733..748642a428 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -239,7 +239,7 @@ private: Stars _stars; VoxelSystem _voxels; - VoxelTree _clipboardTree; // if I copy/paste + VoxelSystem _clipboard; // if I copy/paste VoxelImporter _voxelImporter; QByteArray _voxelsFilename; diff --git a/interface/src/ImportDialog.cpp b/interface/src/ImportDialog.cpp index 49bdef0b81..57b37ca443 100644 --- a/interface/src/ImportDialog.cpp +++ b/interface/src/ImportDialog.cpp @@ -9,8 +9,10 @@ #include #include +#include const QString WINDOW_NAME = QObject::tr("Import Voxels"); +const QString IMPORT_BUTTON_NAME = QObject::tr("Import"); const QString IMPORT_TO_CLIPBOARD_CHECKBOX_STRING = QObject::tr("Import into clipboard"); const QString PREVIEW_CHECKBOX_STRING = QObject::tr("Load preview"); const QString IMPORT_FILE_TYPES = QObject::tr("Sparse Voxel Octree Files, " @@ -20,8 +22,14 @@ const QString IMPORT_FILE_TYPES = QObject::tr("Sparse Voxel Oc const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + const glm::vec3 UP = glm::vec3(0, 1, 0); const float ANGULAR_RATE = 0.02f; +const float VERTICAL_ANGLE = M_PI_4 / 2.0f; +const float RETURN_RATE = 0.02f; +const float NEAR_CLIP = 0.5f; +const float FAR_CLIP = 10.0f; +const float FIELD_OF_VIEW = 60.0f; class GLWidget : public QGLWidget { public: @@ -31,17 +39,25 @@ public: protected: virtual void initializeGL(); - virtual void resizeGL(int w, int h); + virtual void resizeGL(int width, int height); virtual void paintGL(); + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void mouseReleaseEvent(QMouseEvent* event); + private: VoxelSystem* _voxelSystem; bool _draw; - float _a; - float _h; + double _a; // horizontal angle of the camera to the center of the object + double _h; // vertical angle of the camera to the center of the object glm::vec3 _targetCenter; + + bool _pressed; + int _mouseX; + int _mouseY; }; GLWidget::GLWidget(QWidget *parent, VoxelSystem *voxelSystem) @@ -49,8 +65,11 @@ GLWidget::GLWidget(QWidget *parent, VoxelSystem *voxelSystem) _voxelSystem(voxelSystem), _draw(false), _a(0.0f), - _h(0.0f), - _targetCenter(0.5f, 0.5f, 0.5f) { + _h(VERTICAL_ANGLE), + _targetCenter(0.5f, 0.5f, 0.5f), + _pressed(false), + _mouseX(0), + _mouseY(0) { } void GLWidget::initializeGL() { @@ -65,12 +84,15 @@ void GLWidget::initializeGL() { } -void GLWidget::resizeGL(int w, int h) { - glViewport(0, 0, w, h); +void GLWidget::resizeGL(int width, int height) { + glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(60, (float) w / h, 0.25f, 500); + gluPerspective(FIELD_OF_VIEW, + (float) width / height, + NEAR_CLIP, + FAR_CLIP); } void GLWidget::paintGL() { @@ -80,10 +102,14 @@ void GLWidget::paintGL() { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - _a += ANGULAR_RATE; - gluLookAt(_targetCenter.x + (glm::length(_targetCenter) + 0.5f) * cos((double) _a), - _targetCenter.y * 1.25f, - _targetCenter.z + (glm::length(_targetCenter) + 0.5f) * sin((double) _a), + if (!_pressed) { + _a += ANGULAR_RATE; + _h = (1.0f - RETURN_RATE) * _h + RETURN_RATE * VERTICAL_ANGLE; + } + + gluLookAt(_targetCenter.x + (glm::length(_targetCenter) + NEAR_CLIP) * cos(_a), + _targetCenter.y + (glm::length(_targetCenter) + NEAR_CLIP) * sin(_h), + _targetCenter.z + (glm::length(_targetCenter) + NEAR_CLIP) * sin(_a), _targetCenter.x, _targetCenter.y, _targetCenter.z, UP.x, UP.y, UP.z); @@ -102,7 +128,7 @@ void GLWidget::paintGL() { glColor3d(0.4f, 0.4f ,0.4f); - glVertex3d(2 * _targetCenter.x, 2 * _targetCenter.y,2 * _targetCenter.z); + glVertex3d(2 * _targetCenter.x, 2 * _targetCenter.y, 2 * _targetCenter.z); glVertex3d(0 , 2 * _targetCenter.y, 2 * _targetCenter.z); glVertex3d(2 * _targetCenter.x, 2 * _targetCenter.y, 2 * _targetCenter.z); @@ -116,18 +142,40 @@ void GLWidget::paintGL() { } } + +void GLWidget::mousePressEvent(QMouseEvent* event) { + _pressed = true; + _mouseX = event->globalX(); + _mouseY = event->globalY(); +} + +void GLWidget::mouseMoveEvent(QMouseEvent* event) { + _a += (M_PI * (event->globalX() - _mouseX)) / height(); + _h += (M_PI * (event->globalY() - _mouseY)) / height(); + _h = glm::clamp(_h, -M_PI_4, M_PI_4); + + _mouseX = event->globalX(); + _mouseY = event->globalY(); +} + +void GLWidget::mouseReleaseEvent(QMouseEvent* event) { + _pressed = false; +} + ImportDialog::ImportDialog(QWidget *parent, VoxelSystem* voxelSystem) : QFileDialog(parent, WINDOW_NAME, DESKTOP_LOCATION, IMPORT_FILE_TYPES), - _clipboardImportBox (IMPORT_TO_CLIPBOARD_CHECKBOX_STRING, this), - _previewBox (PREVIEW_CHECKBOX_STRING, this), - _previewBar (this), - _glPreview (new GLWidget(this, voxelSystem)) { + _importButton (IMPORT_BUTTON_NAME, this), + _clipboardImportBox(IMPORT_TO_CLIPBOARD_CHECKBOX_STRING, this), + _previewBox (PREVIEW_CHECKBOX_STRING, this), + _previewBar (this), + _glPreview (new GLWidget(this, voxelSystem)) { setOption(QFileDialog::DontUseNativeDialog, true); setFileMode(QFileDialog::ExistingFile); setViewMode(QFileDialog::Detail); QGridLayout* gridLayout = (QGridLayout*) layout(); + gridLayout->addWidget(&_importButton , 2, 2); gridLayout->addWidget(&_clipboardImportBox, 2, 3); gridLayout->addWidget(&_previewBox , 3, 3); gridLayout->addWidget(&_previewBar , 0, 3); @@ -138,43 +186,71 @@ ImportDialog::ImportDialog(QWidget *parent, VoxelSystem* voxelSystem) _previewBar.setRange(0, 100); _previewBar.setValue(0); + connect(&_importButton, SIGNAL(pressed()), SLOT(import())); + connect(&_previewBox, SIGNAL(toggled(bool)), SIGNAL(previewToggled(bool))); connect(&_previewBox, SIGNAL(toggled(bool)), SLOT(preview(bool))); + connect(this, SIGNAL(currentChanged(QString)), SLOT(saveCurrentFile(QString))); connect(&_glTimer, SIGNAL(timeout()), SLOT(timer())); - connect(voxelSystem->getVoxelTree(), SIGNAL(importSize(float,float,float)), SLOT(setGLCamera(float, float, float))); - connect(voxelSystem->getVoxelTree(), SIGNAL(importProgress(int)), &_previewBar, SLOT(setValue(int))); + connect(voxelSystem, SIGNAL(importSize(float,float,float)), SLOT(setGLCamera(float, float, float))); + connect(voxelSystem, SIGNAL(importProgress(int)), &_previewBar, SLOT(setValue(int))); +} + +ImportDialog::~ImportDialog() { + delete _glPreview; +} + +void ImportDialog::import() { + _importButton.setDisabled(true); + _clipboardImportBox.setDisabled(true); + _previewBox.setDisabled(true); + + _previewBar.setValue(0); + _previewBar.setVisible(true); + + emit accepted(); +} + +void ImportDialog::accept() { + QFileDialog::accept(); +} + +void ImportDialog::reject() { + QFileDialog::reject(); } int ImportDialog::exec() { - _previewBox.setChecked(false); - _previewBar.setVisible(false); - + reset(); int ret = QFileDialog::exec(); - - - ((GLWidget*) _glPreview)->setDraw(false); - _glTimer.stop(); - _glPreview->updateGL(); + preview(false); return ret; } void ImportDialog::setGLCamera(float x, float y, float z) { - ((GLWidget*) _glPreview)->setTargetCenter(glm::vec3(x, y, z) / 2.0f); + _glPreview->setTargetCenter(glm::vec3(x, y, z) / 2.0f); } void ImportDialog::reset() { + _previewBox.setChecked(false); + _previewBar.setVisible(false); _previewBar.setValue(0); + _importButton.setEnabled(true); + _clipboardImportBox.setEnabled(true); + _previewBox.setEnabled(true); + + _glTimer.stop(); + _glPreview->setDraw(false); + _glPreview->updateGL(); } void ImportDialog::preview(bool wantPreview) { _previewBar.setValue(0); _previewBar.setVisible(wantPreview); - ((GLWidget*) _glPreview)->setDraw(wantPreview); + _glPreview->setDraw(wantPreview); if (wantPreview) { - emit previewActivated(_currentFile); _glTimer.start(); } else { _glTimer.stop(); diff --git a/interface/src/ImportDialog.h b/interface/src/ImportDialog.h index 013a291af3..f3c1934760 100644 --- a/interface/src/ImportDialog.h +++ b/interface/src/ImportDialog.h @@ -18,20 +18,30 @@ #include #include +class GLWidget; + class ImportDialog : public QFileDialog { Q_OBJECT public: ImportDialog(QWidget* parent = NULL, VoxelSystem* voxelSystem = NULL); + ~ImportDialog(); bool getWantPreview() const { return _previewBox.isChecked(); } + QString getCurrentFile() const { return _currentFile; } + bool getImportIntoClipboard() const { return _clipboardImportBox.isChecked(); } + void reset(); signals: - void previewActivated(QString); + void previewToggled(bool); + void accepted(); public slots: int exec(); void setGLCamera(float x, float y, float z); + void import(); + void accept(); + void reject(); private slots: void preview(bool preview); @@ -40,10 +50,11 @@ private slots: private: QString _currentFile; + QPushButton _importButton; QCheckBox _clipboardImportBox; QCheckBox _previewBox; QProgressBar _previewBar; - QGLWidget* _glPreview; + GLWidget* _glPreview; QTimer _glTimer; }; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ee4cd36b16..181b109bfd 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -233,11 +233,6 @@ Menu::Menu() : 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::ImportVoxelsClipboard, - Qt::SHIFT | Qt::CTRL | Qt::Key_I, - appInstance, - SLOT(importVoxelsToClipboard())); 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())); @@ -776,4 +771,4 @@ void Menu::updateFrustumRenderModeAction() { frustumRenderModeAction->setText("Render Mode - Keyhole"); break; } -} \ No newline at end of file +} diff --git a/interface/src/VoxelImporter.cpp b/interface/src/VoxelImporter.cpp index 488dd4b907..4dbabe129f 100644 --- a/interface/src/VoxelImporter.cpp +++ b/interface/src/VoxelImporter.cpp @@ -11,11 +11,21 @@ #include #include +class ImportTask : public QObject, public QRunnable { +public: + ImportTask(VoxelSystem* voxelSystem, const QString &filename); + void run(); + +private: + VoxelSystem* _voxelSystem; + QString _filename; +}; + class LocalVoxelSystem : public VoxelSystem { public: - LocalVoxelSystem() : VoxelSystem(1) {}; + LocalVoxelSystem() : VoxelSystem(1, 2000000) {} - virtual void removeOutOfView() {}; + virtual void removeOutOfView() {} }; VoxelImporter::VoxelImporter(QWidget* parent) @@ -25,38 +35,107 @@ VoxelImporter::VoxelImporter(QWidget* parent) _currentTask(NULL), _nextTask(NULL) { - connect(&_importDialog, SIGNAL(previewActivated(QString)), SLOT(preImport(QString))); - connect(&_importDialog, SIGNAL(currentChanged(QString)) , SLOT(preImport(QString))); + connect(&_importDialog, SIGNAL(previewToggled(bool)), SLOT(preImport())); + connect(&_importDialog, SIGNAL(currentChanged(QString)), SLOT(preImport())); + connect(&_importDialog, SIGNAL(accepted()), SLOT(import())); } -void VoxelImporter::import(const QString &filename) { - _importDialog.reset(); - _filename = filename; - _currentTask = NULL; - _nextTask = NULL; - - if (_filename == "") { - _importDialog.exec(); +VoxelImporter::~VoxelImporter() { + if (_nextTask) { + delete _nextTask; + _nextTask = NULL; } - + if (_currentTask) { + disconnect(_currentTask, 0, 0, 0); + connect(_currentTask, SIGNAL(destroyed()), _voxelSystem, SLOT(deleteLater())); + _voxelSystem->cancelImport(); + _currentTask = NULL; + } else { + delete _voxelSystem; + } } -void VoxelImporter::preImport(const QString &filename) { - if (_importDialog.getWantPreview() && QFileInfo(filename).isFile()) { +void VoxelImporter::reset() { + _voxelSystem->killLocalVoxels(); + _importDialog.reset(); + _filename = ""; + _currentTask = NULL; + _nextTask = NULL; +} + +int VoxelImporter::exec() { + reset(); + + int ret = _importDialog.exec(); + + if (!ret) { + if (_nextTask) { + delete _nextTask; + _nextTask = NULL; + } + + if (_currentTask) { + _voxelSystem->cancelImport(); + } + } + + return ret; +} + +int VoxelImporter::preImport() { + QString filename = _importDialog.getCurrentFile(); + + if (!QFileInfo(filename).isFile()) { + return 0; + } + + if (_importDialog.getWantPreview()) { _filename = filename; _nextTask = new ImportTask(_voxelSystem, _filename); connect(_nextTask, SIGNAL(destroyed()), SLOT(launchTask())); - _importDialog.reset(); - if (_currentTask != NULL) { - _voxelSystem->getVoxelTree()->cancelImport(); + _voxelSystem->cancelImport(); } else { launchTask(); } } + + return 1; +} + +int VoxelImporter::import() { + QString filename = _importDialog.getCurrentFile(); + + if (!QFileInfo(filename).isFile()) { + _importDialog.reject(); + return 0; + } + + if (_filename == filename) { + if (_currentTask) { + connect(_currentTask, SIGNAL(destroyed()), &_importDialog, SLOT(accept())); + } else { + _importDialog.accept(); + } + return 1; + } + + _filename = filename; + + _nextTask = new ImportTask(_voxelSystem, _filename); + connect(_nextTask, SIGNAL(destroyed()), SLOT(launchTask())); + connect(_nextTask, SIGNAL(destroyed()), &_importDialog, SLOT(accept())); + + if (_currentTask != NULL) { + _voxelSystem->cancelImport(); + } else { + launchTask(); + } + + return 1; } void VoxelImporter::launchTask() { @@ -73,7 +152,6 @@ void VoxelImporter::launchTask() { ImportTask::ImportTask(VoxelSystem* voxelSystem, const QString &filename) : _voxelSystem(voxelSystem), _filename(filename) { - } void ImportTask::run() { @@ -82,8 +160,7 @@ void ImportTask::run() { } else if (_filename.endsWith(".svo", Qt::CaseInsensitive)) { _voxelSystem->readFromSVOFile(_filename.toLocal8Bit().data()); } else if (_filename.endsWith(".schematic", Qt::CaseInsensitive)) { - qDebug("[DEBUG] %d.\n", - _voxelSystem->readFromSchematicFile(_filename.toLocal8Bit().data())); + _voxelSystem->readFromSchematicFile(_filename.toLocal8Bit().data()); } else { qDebug("[ERROR] Invalid file extension.\n"); } diff --git a/interface/src/VoxelImporter.h b/interface/src/VoxelImporter.h index 1e8f1a14ae..be39123367 100644 --- a/interface/src/VoxelImporter.h +++ b/interface/src/VoxelImporter.h @@ -15,33 +15,30 @@ #include #include -class ImportTask : public QObject, public QRunnable { - Q_OBJECT -public: - ImportTask(VoxelSystem* voxelSystem, const QString &filename); - void run(); - -private: - VoxelSystem* _voxelSystem; - QString _filename; -}; +class ImportTask; +class LocalVoxelSystem; class VoxelImporter : public QObject { Q_OBJECT public: VoxelImporter(QWidget* parent = NULL); + ~VoxelImporter(); + void reset(); - void init(); + VoxelSystem* getVoxelSystem() const { return _voxelSystem; } + bool getimportIntoClipboard() const { return _importDialog.getImportIntoClipboard(); } public slots: - void import(const QString &filename = ""); - void preImport(const QString &filename); + int exec(); + int preImport(); + int import(); private slots: void launchTask(); private: VoxelSystem* _voxelSystem; + ImportDialog _importDialog; QString _filename; diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 843d02790a..c1e7f3f06e 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -65,6 +65,9 @@ VoxelSystem::VoxelSystem(float treeScale, int maxVoxels) : _falseColorizeBySource = false; _dataSourceID = UNKNOWN_NODE_ID; _voxelServerCount = 0; + + connect(_tree, SIGNAL(importSize(float,float,float)), SIGNAL(importSize(float,float,float))); + connect(_tree, SIGNAL(importProgress(int)), SIGNAL(importProgress(int))); } void VoxelSystem::nodeDeleted(VoxelNode* node) { @@ -994,6 +997,10 @@ public: { } }; +void VoxelSystem::cancelImport() { + _tree->cancelImport(); +} + // "Remove" voxels from the tree that are not in view. We don't actually delete them, // we remove them from the tree and place them into a holding area for later deletion bool VoxelSystem::removeOutOfViewOperation(VoxelNode* node, void* extraData) { diff --git a/interface/src/VoxelSystem.h b/interface/src/VoxelSystem.h index f45398a96b..aef1bedd6a 100644 --- a/interface/src/VoxelSystem.h +++ b/interface/src/VoxelSystem.h @@ -43,8 +43,6 @@ public: void simulate(float deltaTime) { }; void render(bool texture); - - VoxelTree* getVoxelTree () const {return _tree;} unsigned long getVoxelsUpdated () const {return _voxelsUpdated;}; unsigned long getVoxelsRendered() const {return _voxelsInReadArrays;}; @@ -91,6 +89,10 @@ public: virtual void nodeAdded(Node* node); virtual void nodeKilled(Node* node); +signals: + void importSize(float x, float y, float z); + void importProgress(int progress); + public slots: void collectStatsForTreesAndVBOs(); @@ -104,6 +106,8 @@ public slots: void falseColorizeOccluded(); void falseColorizeOccludedV2(); void falseColorizeBySource(); + + void cancelImport(); protected: float _treeScale; diff --git a/libraries/voxels/src/Tags.cpp b/libraries/voxels/src/Tags.cpp index 914606ce07..32d717cc6b 100644 --- a/libraries/voxels/src/Tags.cpp +++ b/libraries/voxels/src/Tags.cpp @@ -159,19 +159,17 @@ int retrieveData(std::string filename, std::stringstream &ss) { int type = file.peek(); if (type == 0x0A) { - std::cerr << "[DEBUG] Unzipped\n"; ss.flush(); ss << file; return 0; } if (type == 0x1F) { - std::cerr << "[DEBUG] Zipped\n"; int ret = ungzip(file, ss); return ret; } - std::cerr << "[DEBUG] Neither\n"; + std::cerr << "[DEBUG] Schematic compression type not recognize : " << type << std::endl; return 1; } diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 146e013cf6..31b7e30b87 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -361,6 +361,8 @@ void VoxelTree::readBitstreamToTree(unsigned char * bitstream, unsigned long int // skip bitstream to new startPoint bitstreamAt += theseBytesRead; bytesRead += theseBytesRead; + + emit importProgress((100 * (bitstreamAt - bitstream)) / bufferSizeBytes); } this->voxelsBytesRead += bufferSizeBytes; @@ -1559,6 +1561,10 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp bool VoxelTree::readFromSVOFile(const char* fileName) { std::ifstream file(fileName, std::ios::in|std::ios::binary|std::ios::ate); if(file.is_open()) { + + emit importSize(1.0f, 1.0f, 1.0f); + emit importProgress(0); + qDebug("loading file %s...\n", fileName); // get file length.... @@ -1572,6 +1578,8 @@ bool VoxelTree::readFromSVOFile(const char* fileName) { readBitstreamToTree(entireFile, fileLength, args); delete[] entireFile; + emit importProgress(100); + file.close(); return true; } @@ -1585,6 +1593,9 @@ bool VoxelTree::readFromSquareARGB32Pixels(const char* filename) { return false; } + emit importSize(1.0f, 1.0f, 1.0f); + emit importProgress(0); + const uint32_t* pixels; if (pngImage.format() == QImage::Format_ARGB32) { pixels = reinterpret_cast(pngImage.constBits()); @@ -1595,6 +1606,8 @@ bool VoxelTree::readFromSquareARGB32Pixels(const char* filename) { SquarePixelMap pixelMap = SquarePixelMap(pixels, pngImage.height()); pixelMap.addVoxelsToVoxelTree(this); + + emit importProgress(100); return true; } @@ -1629,6 +1642,7 @@ bool VoxelTree::readFromSchematicFile(const char *fileName) { emit importSize(size * schematics.getWidth(), size * schematics.getHeight(), size * schematics.getLength()); + emit importProgress(0); for (int y = 0; y < schematics.getHeight(); ++y) { for (int z = 0; z < schematics.getLength(); ++z) { diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index 7bdfcc68af..e988b3f3e0 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -196,7 +196,7 @@ public: signals: void importSize(float x, float y, float z); - void importProgress(int progress); // emit an int between 0 and 100 reflecting the progress of the import + void importProgress(int progress); public slots: void cancelImport();