mirror of
https://github.com/overte-org/overte.git
synced 2025-04-22 11:53:28 +02:00
More work on import interface
This commit is contained in:
parent
3f320d902e
commit
68a1c56ad6
9 changed files with 336 additions and 249 deletions
|
@ -1623,20 +1623,7 @@ void Application::importVoxelsToClipboard() {
|
|||
|
||||
_clipboardTree.eraseAllVoxels();
|
||||
if (fileNameString.endsWith(".png", Qt::CaseInsensitive)) {
|
||||
QImage pngImage = QImage(fileName);
|
||||
if (pngImage.height() != pngImage.width()) {
|
||||
qDebug("ERROR: Bad PNG size: height != width.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
const uint32_t* pixels;
|
||||
if (pngImage.format() == QImage::Format_ARGB32) {
|
||||
pixels = reinterpret_cast<const uint32_t*>(pngImage.constBits());
|
||||
} else {
|
||||
QImage tmp = pngImage.convertToFormat(QImage::Format_ARGB32);
|
||||
pixels = reinterpret_cast<const uint32_t*>(tmp.constBits());
|
||||
}
|
||||
_clipboardTree.readFromSquareARGB32Pixels(pixels, pngImage.height());
|
||||
_clipboardTree.readFromSquareARGB32Pixels(fileName);
|
||||
} else if (fileNameString.endsWith(".svo", Qt::CaseInsensitive)) {
|
||||
_clipboardTree.readFromSVOFile(fileName);
|
||||
} else if (fileNameString.endsWith(".schematic", Qt::CaseInsensitive)) {
|
||||
|
@ -1696,7 +1683,7 @@ void Application::importVoxels() {
|
|||
pixels = reinterpret_cast<const uint32_t*>(tmp.constBits());
|
||||
}
|
||||
|
||||
importVoxels.readFromSquareARGB32Pixels(pixels, pngImage.height());
|
||||
importVoxels.readFromSquareARGB32Pixels(fileName);
|
||||
} else if (fileNameString.endsWith(".svo", Qt::CaseInsensitive)) {
|
||||
extension = QString(".svo");
|
||||
importVoxels.readFromSVOFile(fileName);
|
||||
|
@ -1963,8 +1950,7 @@ void Application::initMenu() {
|
|||
(_destructiveAddVoxel = voxelMenu->addAction("Create Voxel is Destructive"))->setCheckable(true);
|
||||
|
||||
voxelMenu->addAction("Export Voxels", this, SLOT(exportVoxels()), Qt::CTRL | Qt::Key_E);
|
||||
voxelMenu->addAction("Import Voxels", &_voxelImporter, SLOT(exec()), Qt::CTRL | Qt::Key_I);
|
||||
voxelMenu->addAction("Import Voxels to Clipboard", this, SLOT(importVoxelsToClipboard()), Qt::SHIFT | Qt::CTRL | Qt::Key_I);
|
||||
voxelMenu->addAction("Import Voxels", &_voxelImporter, SLOT(import()), Qt::CTRL | Qt::Key_I);
|
||||
voxelMenu->addAction("Cut Voxels", this, SLOT(cutVoxels()), Qt::CTRL | Qt::Key_X);
|
||||
voxelMenu->addAction("Copy Voxels", this, SLOT(copyVoxels()), Qt::CTRL | Qt::Key_C);
|
||||
voxelMenu->addAction("Paste Voxels", this, SLOT(pasteVoxels()), Qt::CTRL | Qt::Key_V);
|
||||
|
|
|
@ -6,71 +6,85 @@
|
|||
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "VoxelImporter.h"
|
||||
#include <VoxelImporter.h>
|
||||
|
||||
#include <QObject>
|
||||
#include <QStandardPaths>
|
||||
#include <QGridLayout>
|
||||
#include <QFileInfo>
|
||||
#include <QThreadPool>
|
||||
|
||||
const QString WINDOW_NAME = QObject::tr("Import Voxels");
|
||||
const QString PREVIEW_CHECKBOX_STRING = QObject::tr("Load preview");
|
||||
const QString IMPORT_BUTTON_NAME = QObject::tr("Import");
|
||||
const QString IMPORT_TO_CLIPBOARD_BUTTON_NAME = QObject::tr("Import into clipboard");
|
||||
const QString IMPORT_FILE_TYPES = QObject::tr("Sparse Voxel Octree Files, "
|
||||
"Square PNG, "
|
||||
"Schematic Files "
|
||||
"(*.svo *.png *.schematic)");
|
||||
class LocalVoxelSystem : public VoxelSystem {
|
||||
public:
|
||||
LocalVoxelSystem() : VoxelSystem(1) {};
|
||||
|
||||
const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
|
||||
virtual void removeOutOfView() {};
|
||||
};
|
||||
|
||||
VoxelImporter::VoxelImporter(QWidget* parent)
|
||||
: QFileDialog(parent, WINDOW_NAME, DESKTOP_LOCATION, IMPORT_FILE_TYPES),
|
||||
_importButton (IMPORT_BUTTON_NAME , this),
|
||||
_clipboardImportButton(IMPORT_TO_CLIPBOARD_BUTTON_NAME, this),
|
||||
_previewBox (PREVIEW_CHECKBOX_STRING , this),
|
||||
_previewBar (this),
|
||||
_glPreview (this) {
|
||||
: QObject(parent),
|
||||
_voxelSystem(new LocalVoxelSystem()),
|
||||
_importDialog(parent, _voxelSystem),
|
||||
_currentTask(NULL),
|
||||
_nextTask(NULL) {
|
||||
|
||||
setOption(QFileDialog::DontUseNativeDialog, true);
|
||||
setFileMode(QFileDialog::ExistingFile);
|
||||
setViewMode(QFileDialog::Detail);
|
||||
_previewBar.setVisible(false);
|
||||
_glPreview.setVisible(false);
|
||||
|
||||
QGridLayout* gridLayout = (QGridLayout*) layout();
|
||||
gridLayout->addWidget(&_importButton , 2, 2);
|
||||
gridLayout->addWidget(&_clipboardImportButton, 2, 3);
|
||||
gridLayout->addWidget(&_previewBox , 3, 3);
|
||||
gridLayout->addWidget(&_previewBar , 0, 3);
|
||||
gridLayout->addWidget(&_glPreview , 1, 3);
|
||||
|
||||
|
||||
connect(&_importButton , SIGNAL(pressed()), this, SLOT(importVoxels()));
|
||||
connect(&_clipboardImportButton, SIGNAL(pressed()), this, SLOT(importVoxelsToClipboard()));
|
||||
connect(&_previewBox, SIGNAL(toggled(bool)), &_previewBar, SLOT(setVisible(bool)));
|
||||
connect(&_previewBox, SIGNAL(toggled(bool)), &_glPreview , SLOT(setVisible(bool)));
|
||||
connect(&_importDialog, SIGNAL(previewActivated(QString)), SLOT(preImport(QString)));
|
||||
connect(&_importDialog, SIGNAL(currentChanged(QString)) , SLOT(preImport(QString)));
|
||||
}
|
||||
|
||||
int VoxelImporter::exec() {
|
||||
_previewBox.setChecked(false);
|
||||
_previewBar.setVisible(false);
|
||||
_glPreview.setVisible(false);
|
||||
void VoxelImporter::import(const QString &filename) {
|
||||
_importDialog.reset();
|
||||
_filename = filename;
|
||||
_currentTask = NULL;
|
||||
_nextTask = NULL;
|
||||
|
||||
return exec();
|
||||
}
|
||||
if (_filename == "") {
|
||||
_importDialog.exec();
|
||||
}
|
||||
|
||||
|
||||
void VoxelImporter::importVoxels() {
|
||||
accept();
|
||||
qDebug("Congratulation, you imported a file.\n");
|
||||
}
|
||||
|
||||
void VoxelImporter::importVoxelsToClipboard() {
|
||||
accept();
|
||||
qDebug("Congratulation, you imported a file to the clipboard.\n");
|
||||
|
||||
}
|
||||
|
||||
void VoxelImporter::preview(bool) {
|
||||
void VoxelImporter::preImport(const QString &filename) {
|
||||
if (_importDialog.getWantPreview() && QFileInfo(filename).isFile()) {
|
||||
_filename = filename;
|
||||
|
||||
_nextTask = new ImportTask(_voxelSystem, _filename);
|
||||
connect(_nextTask, SIGNAL(destroyed()), SLOT(launchTask()));
|
||||
|
||||
_importDialog.reset();
|
||||
|
||||
if (_currentTask != NULL) {
|
||||
_voxelSystem->getVoxelTree()->cancelImport();
|
||||
} else {
|
||||
launchTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VoxelImporter::launchTask() {
|
||||
if (_nextTask != NULL) {
|
||||
_voxelSystem->killLocalVoxels();
|
||||
_currentTask = _nextTask;
|
||||
_nextTask = NULL;
|
||||
QThreadPool::globalInstance()->start(_currentTask);
|
||||
} else {
|
||||
_currentTask = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ImportTask::ImportTask(VoxelSystem* voxelSystem, const QString &filename)
|
||||
: _voxelSystem(voxelSystem),
|
||||
_filename(filename) {
|
||||
|
||||
}
|
||||
|
||||
void ImportTask::run() {
|
||||
if (_filename.endsWith(".png", Qt::CaseInsensitive)) {
|
||||
_voxelSystem->readFromSquareARGB32Pixels(_filename.toLocal8Bit().data());
|
||||
} 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()));
|
||||
} else {
|
||||
qDebug("[ERROR] Invalid file extension.\n");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,29 +9,45 @@
|
|||
#ifndef __hifi__VoxelImporter__
|
||||
#define __hifi__VoxelImporter__
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QPushButton>
|
||||
#include <QCheckBox>
|
||||
#include <QProgressBar>
|
||||
#include <QGLWidget>
|
||||
#include <VoxelSystem.h>
|
||||
#include <ImportDialog.h>
|
||||
|
||||
class VoxelImporter : public QFileDialog {
|
||||
#include <QThread>
|
||||
#include <QRunnable>
|
||||
|
||||
class ImportTask : public QObject, public QRunnable {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ImportTask(VoxelSystem* voxelSystem, const QString &filename);
|
||||
void run();
|
||||
|
||||
private:
|
||||
VoxelSystem* _voxelSystem;
|
||||
QString _filename;
|
||||
};
|
||||
|
||||
class VoxelImporter : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
VoxelImporter(QWidget* parent = NULL);
|
||||
|
||||
void init();
|
||||
|
||||
public slots:
|
||||
int exec();
|
||||
void importVoxels();
|
||||
void importVoxelsToClipboard();
|
||||
void preview(bool);
|
||||
void import(const QString &filename = "");
|
||||
void preImport(const QString &filename);
|
||||
|
||||
private slots:
|
||||
void launchTask();
|
||||
|
||||
private:
|
||||
QPushButton _importButton;
|
||||
QPushButton _clipboardImportButton;
|
||||
QCheckBox _previewBox;
|
||||
QProgressBar _previewBar;
|
||||
QGLWidget _glPreview;
|
||||
VoxelSystem* _voxelSystem;
|
||||
ImportDialog _importDialog;
|
||||
|
||||
QString _filename;
|
||||
|
||||
ImportTask* _currentTask;
|
||||
ImportTask* _nextTask;
|
||||
};
|
||||
|
||||
#endif /* defined(__hifi__VoxelImporter__) */
|
||||
|
|
|
@ -139,6 +139,22 @@ bool VoxelSystem::readFromSVOFile(const char* filename) {
|
|||
return result;
|
||||
}
|
||||
|
||||
bool VoxelSystem::readFromSquareARGB32Pixels(const char *filename) {
|
||||
bool result = _tree->readFromSquareARGB32Pixels(filename);
|
||||
if (result) {
|
||||
setupNewVoxelsForDrawing();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool VoxelSystem::readFromSchematicFile(const char* filename) {
|
||||
bool result = _tree->readFromSchematicFile(filename);
|
||||
if (result) {
|
||||
setupNewVoxelsForDrawing();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
long int VoxelSystem::getVoxelsCreated() {
|
||||
return _tree->voxelsCreated;
|
||||
}
|
||||
|
|
|
@ -42,12 +42,16 @@ public:
|
|||
void simulate(float deltaTime) { };
|
||||
void render(bool texture);
|
||||
|
||||
unsigned long getVoxelsUpdated() const {return _voxelsUpdated;};
|
||||
|
||||
VoxelTree* getVoxelTree () const {return _tree;}
|
||||
unsigned long getVoxelsUpdated () const {return _voxelsUpdated;};
|
||||
unsigned long getVoxelsRendered() const {return _voxelsInReadArrays;};
|
||||
|
||||
void loadVoxelsFile(const char* fileName,bool wantColorRandomizer);
|
||||
void writeToSVOFile(const char* filename, VoxelNode* node) const;
|
||||
bool readFromSVOFile(const char* filename);
|
||||
bool readFromSquareARGB32Pixels(const char* filename);
|
||||
bool readFromSchematicFile(const char* filename);
|
||||
|
||||
long int getVoxelsCreated();
|
||||
long int getVoxelsColored();
|
||||
|
|
|
@ -159,14 +159,19 @@ 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) {
|
||||
return ungzip(file, ss);
|
||||
std::cerr << "[DEBUG] Zipped\n";
|
||||
int ret = ungzip(file, ss);
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::cerr << "[DEBUG] Neither\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -242,3 +247,156 @@ int ungzip(std::ifstream &file, std::stringstream &ss) {
|
|||
}
|
||||
|
||||
|
||||
void computeBlockColor(int id, int data, int& red, int& green, int& blue, int& create) {
|
||||
|
||||
switch (id) {
|
||||
case 1:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
case 21:
|
||||
case 56:
|
||||
case 73:
|
||||
case 74:
|
||||
case 97:
|
||||
case 129: red = 128; green = 128; blue = 128; break;
|
||||
case 2: red = 77; green = 117; blue = 66; break;
|
||||
case 3:
|
||||
case 60: red = 116; green = 83; blue = 56; break;
|
||||
case 4: red = 71; green = 71; blue = 71; break;
|
||||
case 5:
|
||||
case 125: red = 133; green = 94; blue = 62; break;
|
||||
case 7: red = 35; green = 35; blue = 35; break;
|
||||
case 8:
|
||||
case 9: red = 100; green = 109; blue = 185; break;
|
||||
case 10:
|
||||
case 11: red = 192; green = 64; blue = 8; break;
|
||||
case 12: red = 209; green = 199; blue = 155; break;
|
||||
case 13: red = 96; green = 94; blue = 93; break;
|
||||
case 17: red = 71; green = 56; blue = 35; break;
|
||||
case 18: red = 76; green = 104; blue = 64; break;
|
||||
case 19: red = 119; green = 119; blue = 37; break;
|
||||
case 22: red = 22; green = 44; blue = 86; break;
|
||||
case 23:
|
||||
case 29:
|
||||
case 33:
|
||||
case 61:
|
||||
case 62:
|
||||
case 158: red = 61; green = 61; blue = 61; break;
|
||||
case 24: red = 209; green = 202; blue = 156; break;
|
||||
case 25:
|
||||
case 58:
|
||||
case 84:
|
||||
case 137: red = 57; green = 38; blue = 25; break;
|
||||
case 35:
|
||||
switch (data) {
|
||||
case 0: red = 234; green = 234; blue = 234; break;
|
||||
case 1: red = 224; green = 140; blue = 84; break;
|
||||
case 2: red = 185; green = 90; blue = 194; break;
|
||||
case 3: red = 124; green = 152; blue = 208; break;
|
||||
case 4: red = 165; green = 154; blue = 35; break;
|
||||
case 5: red = 70; green = 187; blue = 61; break;
|
||||
case 6: red = 206; green = 124; blue = 145; break;
|
||||
case 7: red = 66; green = 66; blue = 66; break;
|
||||
case 8: red = 170; green = 176; blue = 176; break;
|
||||
case 9: red = 45; green = 108; blue = 35; break;
|
||||
case 10: red = 130; green = 62; blue = 8; break;
|
||||
case 11: red = 43; green = 51; blue = 29; break;
|
||||
case 12: red = 73; green = 47; blue = 29; break;
|
||||
case 13: red = 57; green = 76; blue = 36; break;
|
||||
case 14: red = 165; green = 58; blue = 53; break;
|
||||
case 15: red = 24; green = 24; blue = 24; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 41: red = 239; green = 238; blue = 105; break;
|
||||
case 42: red = 146; green = 146; blue = 146; break;
|
||||
case 43:
|
||||
case 98: red = 161; green = 161; blue = 161; break;
|
||||
case 44:
|
||||
create = 3;
|
||||
|
||||
switch (data) {
|
||||
case 0: red = 161; green = 161; blue = 161; break;
|
||||
case 1: red = 209; green = 202; blue = 156; break;
|
||||
case 2: red = 133; green = 94; blue = 62; break;
|
||||
case 3: red = 71; green = 71; blue = 71; break;
|
||||
case 4: red = 121; green = 67; blue = 53; break;
|
||||
case 5: red = 161; green = 161; blue = 161; break;
|
||||
case 6: red = 45; green = 22; blue = 26; break;
|
||||
case 7: red = 195; green = 192; blue = 185; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 45: red = 121; green = 67; blue = 53; break;
|
||||
case 46: red = 118; green = 36; blue = 13; break;
|
||||
case 47: red = 155; green = 127; blue = 76; break;
|
||||
case 48: red = 61; green = 79; blue = 61; break;
|
||||
case 49: red = 52; green = 41; blue = 74; break;
|
||||
case 52: red = 12; green = 66; blue = 71; break;
|
||||
case 53:
|
||||
case 67:
|
||||
case 108:
|
||||
case 109:
|
||||
case 114:
|
||||
case 128:
|
||||
case 134:
|
||||
case 135:
|
||||
case 136:
|
||||
case 156:
|
||||
create = 2;
|
||||
|
||||
switch (id) {
|
||||
case 53:
|
||||
case 134:
|
||||
case 135:
|
||||
case 136: red = 133; green = 94; blue = 62; break;
|
||||
case 67: red = 71; green = 71; blue = 71; break;
|
||||
case 108: red = 121; green = 67; blue = 53; break;
|
||||
case 109: red = 161; green = 161; blue = 161; break;
|
||||
case 114: red = 45; green = 22; blue = 26; break;
|
||||
case 128: red = 209; green = 202; blue = 156; break;
|
||||
case 156: red = 195; green = 192; blue = 185; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 54:
|
||||
case 95:
|
||||
case 146: red = 155; green = 105; blue = 32; break;
|
||||
case 57: red = 145; green = 219; blue = 215; break;
|
||||
case 79: red = 142; green = 162; blue = 195; break;
|
||||
case 80: red = 255; green = 255; blue = 255; break;
|
||||
case 81: red = 8; green = 64; blue = 15; break;
|
||||
case 82: red = 150; green = 155; blue = 166; break;
|
||||
case 86:
|
||||
case 91: red = 179; green = 108; blue = 17; break;
|
||||
case 87:
|
||||
case 153: red = 91; green = 31; blue = 30; break;
|
||||
case 88: red = 68; green = 49; blue = 38; break;
|
||||
case 89: red = 180; green = 134; blue = 65; break;
|
||||
case 103: red = 141; green = 143; blue = 36; break;
|
||||
case 110: red = 103; green = 92; blue = 95; break;
|
||||
case 112: red = 45; green = 22; blue = 26; break;
|
||||
case 121: red = 183; green = 178; blue = 129; break;
|
||||
case 123: red = 101; green = 59; blue = 31; break;
|
||||
case 124: red = 213; green = 178; blue = 123; break;
|
||||
case 130: red = 38; green = 54; blue = 56; break;
|
||||
case 133: red = 53; green = 84; blue = 85; break;
|
||||
case 152: red = 131; green = 22; blue = 7; break;
|
||||
case 155: red = 195; green = 192; blue = 185; break;
|
||||
case 159: red = 195; green = 165; blue = 150; break;
|
||||
case 170: red = 168; green = 139; blue = 15; break;
|
||||
case 172: red = 140; green = 86; blue = 61; break;
|
||||
case 173: red = 9; green = 9; blue = 9; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,8 +29,9 @@
|
|||
#define TAG_Compound 10
|
||||
#define TAG_Int_Array 11
|
||||
|
||||
int retrieveData(std::string filename, std::stringstream &ss);
|
||||
int ungzip(std::ifstream &file, std::stringstream &ss);
|
||||
int retrieveData(std::string filename, std::stringstream &ss);
|
||||
int ungzip(std::ifstream &file, std::stringstream &ss);
|
||||
void computeBlockColor(int id, int data, int& r, int& g, int& b, int& create);
|
||||
|
||||
class Tag {
|
||||
public:
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <glm/gtc/noise.hpp>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QImage>
|
||||
|
||||
#include "CoverageMap.h"
|
||||
#include "GeometryUtil.h"
|
||||
|
@ -48,7 +49,8 @@ VoxelTree::VoxelTree(bool shouldReaverage) :
|
|||
voxelsColoredStats(100),
|
||||
voxelsBytesReadStats(100),
|
||||
_isDirty(true),
|
||||
_shouldReaverage(shouldReaverage) {
|
||||
_shouldReaverage(shouldReaverage),
|
||||
_stopImport(false) {
|
||||
rootNode = new VoxelNode();
|
||||
}
|
||||
|
||||
|
@ -1576,15 +1578,29 @@ bool VoxelTree::readFromSVOFile(const char* fileName) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool VoxelTree::readFromSquareARGB32Pixels(const uint32_t* pixels, int dimension) {
|
||||
SquarePixelMap pixelMap = SquarePixelMap(pixels, dimension);
|
||||
bool VoxelTree::readFromSquareARGB32Pixels(const char* filename) {
|
||||
QImage pngImage = QImage(filename);
|
||||
if (pngImage.height() != pngImage.width()) {
|
||||
qDebug("ERROR: Bad PNG size: height != width.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
const uint32_t* pixels;
|
||||
if (pngImage.format() == QImage::Format_ARGB32) {
|
||||
pixels = reinterpret_cast<const uint32_t*>(pngImage.constBits());
|
||||
} else {
|
||||
QImage tmp = pngImage.convertToFormat(QImage::Format_ARGB32);
|
||||
pixels = reinterpret_cast<const uint32_t*>(tmp.constBits());
|
||||
}
|
||||
|
||||
SquarePixelMap pixelMap = SquarePixelMap(pixels, pngImage.height());
|
||||
pixelMap.addVoxelsToVoxelTree(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool VoxelTree::readFromSchematicFile(const char *fileName) {
|
||||
std::stringstream ss;
|
||||
int err = retrieveData(fileName, ss);
|
||||
int err = retrieveData(std::string(fileName), ss);
|
||||
if (err && ss.get() != TAG_Compound) {
|
||||
qDebug("[ERROR] Invalid schematic file.\n");
|
||||
return false;
|
||||
|
@ -1593,10 +1609,12 @@ bool VoxelTree::readFromSchematicFile(const char *fileName) {
|
|||
ss.get();
|
||||
TagCompound schematics(ss);
|
||||
if (!schematics.getBlocksId() || !schematics.getBlocksData()) {
|
||||
qDebug("[ERROR] Invalid schematic file.\n");
|
||||
qDebug("[ERROR] Invalid schematic data.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
_stopImport = false;
|
||||
|
||||
int max = (schematics.getWidth() > schematics.getLength()) ? schematics.getWidth() : schematics.getLength();
|
||||
max = (max > schematics.getHeight()) ? max : schematics.getHeight();
|
||||
|
||||
|
@ -1608,9 +1626,21 @@ bool VoxelTree::readFromSchematicFile(const char *fileName) {
|
|||
int red = 128, green = 128, blue = 128;
|
||||
int count = 0;
|
||||
|
||||
emit importSize(size * schematics.getWidth(),
|
||||
size * schematics.getHeight(),
|
||||
size * schematics.getLength());
|
||||
|
||||
for (int y = 0; y < schematics.getHeight(); ++y) {
|
||||
for (int z = 0; z < schematics.getLength(); ++z) {
|
||||
emit importProgress((int) 100 * (y * schematics.getLength() + z) / (schematics.getHeight() * schematics.getLength()));
|
||||
|
||||
for (int x = 0; x < schematics.getWidth(); ++x) {
|
||||
if (_stopImport) {
|
||||
qDebug("[DEBUG] Canceled import at %d voxels.\n", count);
|
||||
_stopImport = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
int pos = ((y * schematics.getLength()) + z) * schematics.getWidth() + x;
|
||||
int id = schematics.getBlocksId()[pos];
|
||||
int data = schematics.getBlocksData()[pos];
|
||||
|
@ -1656,6 +1686,7 @@ bool VoxelTree::readFromSchematicFile(const char *fileName) {
|
|||
}
|
||||
}
|
||||
|
||||
emit importProgress(100);
|
||||
qDebug("Created %d voxels from minecraft import.\n", count);
|
||||
|
||||
return true;
|
||||
|
@ -1747,155 +1778,6 @@ void VoxelTree::copyFromTreeIntoSubTree(VoxelTree* sourceTree, VoxelNode* destin
|
|||
}
|
||||
}
|
||||
|
||||
void VoxelTree::computeBlockColor(int id, int data, int& red, int& green, int& blue, int& create) {
|
||||
|
||||
switch (id) {
|
||||
case 1:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
case 21:
|
||||
case 56:
|
||||
case 73:
|
||||
case 74:
|
||||
case 97:
|
||||
case 129: red = 128; green = 128; blue = 128; break;
|
||||
case 2: red = 77; green = 117; blue = 66; break;
|
||||
case 3:
|
||||
case 60: red = 116; green = 83; blue = 56; break;
|
||||
case 4: red = 71; green = 71; blue = 71; break;
|
||||
case 5:
|
||||
case 125: red = 133; green = 94; blue = 62; break;
|
||||
case 7: red = 35; green = 35; blue = 35; break;
|
||||
case 8:
|
||||
case 9: red = 100; green = 109; blue = 185; break;
|
||||
case 10:
|
||||
case 11: red = 192; green = 64; blue = 8; break;
|
||||
case 12: red = 209; green = 199; blue = 155; break;
|
||||
case 13: red = 96; green = 94; blue = 93; break;
|
||||
case 17: red = 71; green = 56; blue = 35; break;
|
||||
case 18: red = 76; green = 104; blue = 64; break;
|
||||
case 19: red = 119; green = 119; blue = 37; break;
|
||||
case 22: red = 22; green = 44; blue = 86; break;
|
||||
case 23:
|
||||
case 29:
|
||||
case 33:
|
||||
case 61:
|
||||
case 62:
|
||||
case 158: red = 61; green = 61; blue = 61; break;
|
||||
case 24: red = 209; green = 202; blue = 156; break;
|
||||
case 25:
|
||||
case 58:
|
||||
case 84:
|
||||
case 137: red = 57; green = 38; blue = 25; break;
|
||||
case 35:
|
||||
switch (data) {
|
||||
case 0: red = 234; green = 234; blue = 234; break;
|
||||
case 1: red = 224; green = 140; blue = 84; break;
|
||||
case 2: red = 185; green = 90; blue = 194; break;
|
||||
case 3: red = 124; green = 152; blue = 208; break;
|
||||
case 4: red = 165; green = 154; blue = 35; break;
|
||||
case 5: red = 70; green = 187; blue = 61; break;
|
||||
case 6: red = 206; green = 124; blue = 145; break;
|
||||
case 7: red = 66; green = 66; blue = 66; break;
|
||||
case 8: red = 170; green = 176; blue = 176; break;
|
||||
case 9: red = 45; green = 108; blue = 35; break;
|
||||
case 10: red = 130; green = 62; blue = 8; break;
|
||||
case 11: red = 43; green = 51; blue = 29; break;
|
||||
case 12: red = 73; green = 47; blue = 29; break;
|
||||
case 13: red = 57; green = 76; blue = 36; break;
|
||||
case 14: red = 165; green = 58; blue = 53; break;
|
||||
case 15: red = 24; green = 24; blue = 24; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 41: red = 239; green = 238; blue = 105; break;
|
||||
case 42: red = 146; green = 146; blue = 146; break;
|
||||
case 43:
|
||||
case 98: red = 161; green = 161; blue = 161; break;
|
||||
case 44:
|
||||
create = 3;
|
||||
|
||||
switch (data) {
|
||||
case 0: red = 161; green = 161; blue = 161; break;
|
||||
case 1: red = 209; green = 202; blue = 156; break;
|
||||
case 2: red = 133; green = 94; blue = 62; break;
|
||||
case 3: red = 71; green = 71; blue = 71; break;
|
||||
case 4: red = 121; green = 67; blue = 53; break;
|
||||
case 5: red = 161; green = 161; blue = 161; break;
|
||||
case 6: red = 45; green = 22; blue = 26; break;
|
||||
case 7: red = 195; green = 192; blue = 185; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 45: red = 121; green = 67; blue = 53; break;
|
||||
case 46: red = 118; green = 36; blue = 13; break;
|
||||
case 47: red = 155; green = 127; blue = 76; break;
|
||||
case 48: red = 61; green = 79; blue = 61; break;
|
||||
case 49: red = 52; green = 41; blue = 74; break;
|
||||
case 52: red = 12; green = 66; blue = 71; break;
|
||||
case 53:
|
||||
case 67:
|
||||
case 108:
|
||||
case 109:
|
||||
case 114:
|
||||
case 128:
|
||||
case 134:
|
||||
case 135:
|
||||
case 136:
|
||||
case 156:
|
||||
create = 2;
|
||||
|
||||
switch (id) {
|
||||
case 53:
|
||||
case 134:
|
||||
case 135:
|
||||
case 136: red = 133; green = 94; blue = 62; break;
|
||||
case 67: red = 71; green = 71; blue = 71; break;
|
||||
case 108: red = 121; green = 67; blue = 53; break;
|
||||
case 109: red = 161; green = 161; blue = 161; break;
|
||||
case 114: red = 45; green = 22; blue = 26; break;
|
||||
case 128: red = 209; green = 202; blue = 156; break;
|
||||
case 156: red = 195; green = 192; blue = 185; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 54:
|
||||
case 95:
|
||||
case 146: red = 155; green = 105; blue = 32; break;
|
||||
case 57: red = 145; green = 219; blue = 215; break;
|
||||
case 79: red = 142; green = 162; blue = 195; break;
|
||||
case 80: red = 255; green = 255; blue = 255; break;
|
||||
case 81: red = 8; green = 64; blue = 15; break;
|
||||
case 82: red = 150; green = 155; blue = 166; break;
|
||||
case 86:
|
||||
case 91: red = 179; green = 108; blue = 17; break;
|
||||
case 87:
|
||||
case 153: red = 91; green = 31; blue = 30; break;
|
||||
case 88: red = 68; green = 49; blue = 38; break;
|
||||
case 89: red = 180; green = 134; blue = 65; break;
|
||||
case 103: red = 141; green = 143; blue = 36; break;
|
||||
case 110: red = 103; green = 92; blue = 95; break;
|
||||
case 112: red = 45; green = 22; blue = 26; break;
|
||||
case 121: red = 183; green = 178; blue = 129; break;
|
||||
case 123: red = 101; green = 59; blue = 31; break;
|
||||
case 124: red = 213; green = 178; blue = 123; break;
|
||||
case 130: red = 38; green = 54; blue = 56; break;
|
||||
case 133: red = 53; green = 84; blue = 85; break;
|
||||
case 152: red = 131; green = 22; blue = 7; break;
|
||||
case 155: red = 195; green = 192; blue = 185; break;
|
||||
case 159: red = 195; green = 165; blue = 150; break;
|
||||
case 170: red = 168; green = 139; blue = 15; break;
|
||||
case 172: red = 140; green = 86; blue = 61; break;
|
||||
case 173: red = 9; green = 9; blue = 9; break;
|
||||
default:
|
||||
create = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
void VoxelTree::cancelImport() {
|
||||
_stopImport = true;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#include "VoxelNodeBag.h"
|
||||
#include "VoxelSceneStats.h"
|
||||
|
||||
#include <QObject>
|
||||
|
||||
// Callback function, for recuseTreeWithOperation
|
||||
typedef bool (*RecurseVoxelTreeOperation)(VoxelNode* node, void* extraData);
|
||||
typedef enum {GRADIENT, RANDOM, NATURAL} creationMode;
|
||||
|
@ -112,7 +114,8 @@ public:
|
|||
{}
|
||||
};
|
||||
|
||||
class VoxelTree {
|
||||
class VoxelTree : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
// when a voxel is created in the tree (object new'd)
|
||||
long voxelsCreated;
|
||||
|
@ -172,9 +175,8 @@ public:
|
|||
void writeToSVOFile(const char* filename, VoxelNode* node = NULL) const;
|
||||
bool readFromSVOFile(const char* filename);
|
||||
// reads voxels from square image with alpha as a Y-axis
|
||||
bool readFromSquareARGB32Pixels(const uint32_t* pixels, int dimension);
|
||||
bool readFromSquareARGB32Pixels(const char *filename);
|
||||
bool readFromSchematicFile(const char* filename);
|
||||
void computeBlockColor(int id, int data, int& r, int& g, int& b, int& create);
|
||||
|
||||
unsigned long getVoxelCount();
|
||||
|
||||
|
@ -192,6 +194,13 @@ public:
|
|||
RecurseVoxelTreeOperation operation,
|
||||
const glm::vec3& point, void* extraData);
|
||||
|
||||
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
|
||||
|
||||
public slots:
|
||||
void cancelImport();
|
||||
|
||||
|
||||
private:
|
||||
void deleteVoxelCodeFromTreeRecursion(VoxelNode* node, void* extraData);
|
||||
|
@ -209,6 +218,7 @@ private:
|
|||
bool _isDirty;
|
||||
unsigned long int _nodesChangedFromBitstream;
|
||||
bool _shouldReaverage;
|
||||
bool _stopImport;
|
||||
};
|
||||
|
||||
float boundaryDistanceForRenderLevel(unsigned int renderLevel);
|
||||
|
|
Loading…
Reference in a new issue