aboutsummaryrefslogtreecommitdiff
path: root/tools/ArtistTools/source/BlastPlugin/Window/FractureVoronoiSettingsPanel.cpp
diff options
context:
space:
mode:
authorBryan Galdrikian <[email protected]>2017-02-24 09:32:20 -0800
committerBryan Galdrikian <[email protected]>2017-02-24 09:32:20 -0800
commite1bf674c16e3c8472b29574159c789cd3f0c64e0 (patch)
tree9f0cfce09c71a2c27ff19589fcad6cd83504477c /tools/ArtistTools/source/BlastPlugin/Window/FractureVoronoiSettingsPanel.cpp
parentfirst commit (diff)
downloadblast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.tar.xz
blast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.zip
Updating to [email protected] and [email protected] with a new directory structure.
NvBlast folder is gone, files have been moved to top level directory. README is changed to reflect this.
Diffstat (limited to 'tools/ArtistTools/source/BlastPlugin/Window/FractureVoronoiSettingsPanel.cpp')
-rw-r--r--tools/ArtistTools/source/BlastPlugin/Window/FractureVoronoiSettingsPanel.cpp354
1 files changed, 354 insertions, 0 deletions
diff --git a/tools/ArtistTools/source/BlastPlugin/Window/FractureVoronoiSettingsPanel.cpp b/tools/ArtistTools/source/BlastPlugin/Window/FractureVoronoiSettingsPanel.cpp
new file mode 100644
index 0000000..2142f80
--- /dev/null
+++ b/tools/ArtistTools/source/BlastPlugin/Window/FractureVoronoiSettingsPanel.cpp
@@ -0,0 +1,354 @@
+#include "FractureVoronoiSettingsPanel.h"
+#include "ui_FractureVoronoiSettingsPanel.h"
+#include "ProjectParams.h"
+#include <QtWidgets/QInputDialog>
+#include <QtWidgets/QLineEdit>
+#include <QtWidgets/QMessageBox>
+#include <QtCore/QFileInfo>
+#include "AppMainWindow.h"
+#include "ProjectParams.h"
+#include "SimpleScene.h"
+#include "SampleManager.h"
+
+FractureVoronoiSettingsPanel::FractureVoronoiSettingsPanel(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::FractureVoronoiSettingsPanel),
+ _updateData(true)
+{
+ ui->setupUi(this);
+
+ ui->groupBoxVisualizers->hide();
+}
+
+FractureVoronoiSettingsPanel::~FractureVoronoiSettingsPanel()
+{
+ delete ui;
+}
+
+void FractureVoronoiSettingsPanel::updateValues()
+{
+ _updateData = false;
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+
+ ui->spinBoxNumberOfSites->setValue(voronoi.numSites);
+ ui->comboBoxSiteGeneration->setCurrentIndex(voronoi.siteGeneration);
+ ui->spinBoxGridSize->setValue(voronoi.gridSize);
+ ui->spinBoxGridScale->setValue(voronoi.gridScale);
+ ui->spinBoxAmplitude->setValue(voronoi.amplitude);
+ ui->spinBoxFrequency->setValue(voronoi.frequency);
+
+ _updatePaintMaskComboBox();
+
+ _updateMeshCutterComboBox();
+ ui->checkBoxFractureInsideCutter->setChecked(voronoi.fractureInsideCutter);
+ ui->checkBoxFractureOutsideCutter->setChecked(voronoi.fractureOutsideCutter);
+
+ ui->spinBoxTextureSites->setValue(voronoi.numTextureSites);
+
+ _updateTextureListWidget();
+ _updateData = true;
+}
+
+void FractureVoronoiSettingsPanel::on_checkBoxGridPreview_stateChanged(int arg1)
+{
+
+}
+
+void FractureVoronoiSettingsPanel::on_checkBoxFracturePreview_stateChanged(int arg1)
+{
+
+}
+
+void FractureVoronoiSettingsPanel::on_checkBoxCutterMesh_stateChanged(int arg1)
+{
+
+}
+
+void FractureVoronoiSettingsPanel::on_spinBoxNumberOfSites_valueChanged(int arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.numSites = arg1;
+}
+
+void FractureVoronoiSettingsPanel::on_comboBoxSiteGeneration_currentIndexChanged(int index)
+{
+ if (!_updateData)
+ return;
+
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.siteGeneration = index;
+}
+
+void FractureVoronoiSettingsPanel::on_spinBoxGridSize_valueChanged(int arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.gridSize = arg1;
+}
+
+void FractureVoronoiSettingsPanel::on_spinBoxGridScale_valueChanged(double arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.gridScale = arg1;
+}
+
+void FractureVoronoiSettingsPanel::on_spinBoxAmplitude_valueChanged(double arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.amplitude = arg1;
+}
+
+void FractureVoronoiSettingsPanel::on_spinBoxFrequency_valueChanged(int arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.frequency = arg1;
+}
+
+void FractureVoronoiSettingsPanel::on_comboBoxPaintMasks_currentIndexChanged(int index)
+{
+ if (!_updateData)
+ return;
+
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.activePaintMask = index;
+}
+
+void FractureVoronoiSettingsPanel::on_btnAddPaintMasks_clicked()
+{
+ bool ok = false;
+ QString name = QInputDialog::getText(this,
+ tr("Blast Tool"),
+ tr("Please input name for new paint mask:"),
+ QLineEdit::Normal,
+ "",
+ &ok);
+ bool nameExist = BlastProject::ins().isPaintMaskNameExist(name.toUtf8().data());
+ if (ok && !name.isEmpty() && !nameExist)
+ {
+ BlastProject::ins().addPaintMasks(name.toUtf8().data());
+ _updatePaintMaskComboBox();
+ ui->comboBoxPaintMasks->setCurrentIndex(ui->comboBoxPaintMasks->count() - 1);
+ }
+ else if (ok && nameExist)
+ {
+ QMessageBox::warning(this, "Blast Tool", "The name you input is already exist!");
+ }
+ else if (ok && name.isEmpty())
+ {
+ QMessageBox::warning(this, "Blast Tool", "You need input a name for the new paint mask!");
+ }
+}
+
+void FractureVoronoiSettingsPanel::on_btnRemovePaintMasks_clicked()
+{
+ if (ui->comboBoxPaintMasks->currentIndex() > -1)
+ {
+ BlastProject::ins().removePaintMasks(ui->comboBoxPaintMasks->currentText().toUtf8().data());
+ _updatePaintMaskComboBox();
+ }
+}
+
+void FractureVoronoiSettingsPanel::on_comboBoxMeshCutter_currentIndexChanged(int index)
+{
+ if (!_updateData)
+ return;
+
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.activeMeshCutter = index;
+}
+
+void FractureVoronoiSettingsPanel::on_btnAddMeshCutter_clicked()
+{
+ bool ok = false;
+ QString name = QInputDialog::getText(this,
+ tr("Blast Tool"),
+ tr("Please input name for new mesh cutter:"),
+ QLineEdit::Normal,
+ "",
+ &ok);
+ bool nameExist = BlastProject::ins().isMeshCutterNameExist(name.toUtf8().data());
+ if (ok && !name.isEmpty() && !nameExist)
+ {
+ BlastProject::ins().addMeshCutter(name.toUtf8().data());
+ _updateMeshCutterComboBox();
+ ui->comboBoxMeshCutter->setCurrentIndex(ui->comboBoxMeshCutter->count() - 1);
+ }
+ else if (ok && nameExist)
+ {
+ QMessageBox::warning(this, "Blast Tool", "The name you input is already exist!");
+ }
+ else if (ok && name.isEmpty())
+ {
+ QMessageBox::warning(this, "Blast Tool", "You need input a name for the new cutter mesh!");
+ }
+}
+
+void FractureVoronoiSettingsPanel::on_btnRemoveMeshCutter_clicked()
+{
+ if (ui->comboBoxMeshCutter->currentIndex() > -1)
+ {
+ BlastProject::ins().removeMeshCutter(ui->comboBoxMeshCutter->currentText().toUtf8().data());
+ _updateMeshCutterComboBox();
+ }
+}
+
+void FractureVoronoiSettingsPanel::on_checkBoxFractureInsideCutter_stateChanged(int arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.fractureInsideCutter = (arg1 != 0 ? true : false);
+}
+
+void FractureVoronoiSettingsPanel::on_checkBoxFractureOutsideCutter_stateChanged(int arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.fractureOutsideCutter = (arg1 != 0 ? true : false);
+}
+
+void FractureVoronoiSettingsPanel::on_btnAddTexture_clicked()
+{
+ QString texName = AppMainWindow::Inst().OpenTextureFile();
+
+ if (texName.isEmpty())
+ return;
+
+ QFileInfo fileInfo(texName);
+ QByteArray ba = fileInfo.absoluteFilePath().toLocal8Bit();
+ const char* filePath = (const char*)(ba);
+
+ if (!BlastProject::ins().isVoronoiTextureNameExist(texName.toUtf8().data()))
+ {
+ BlastProject::ins().addVoronoiTexture(filePath);
+ _updateTextureListWidget();
+ ui->listWidgetTexture->setCurrentRow(ui->listWidgetTexture->count() - 1);
+ }
+ else
+ {
+ QMessageBox::warning(this, "Blast Tool", "The texture you selected is already exist!");
+ }
+}
+
+void FractureVoronoiSettingsPanel::on_btnReloadTexture_clicked()
+{
+
+}
+
+void FractureVoronoiSettingsPanel::on_btnRemoveTexture_clicked()
+{
+ if (ui->listWidgetTexture->currentRow() != -1)
+ {
+ QListWidgetItem *item = ui->listWidgetTexture->currentItem();
+ QString texture = _getTexturePathByName(item->text());
+ QByteArray ba = texture.toLocal8Bit();
+ BlastProject::ins().removeVoronoiTexture(ba.data());
+ _updateTextureListWidget();
+ }
+}
+
+void FractureVoronoiSettingsPanel::on_spinBoxTextureSites_valueChanged(int arg1)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ voronoi.numTextureSites = arg1;
+}
+
+void FractureVoronoiSettingsPanel::on_listWidgetTexture_itemSelectionChanged()
+{
+
+}
+
+void FractureVoronoiSettingsPanel::on_btnTextureMap_clicked()
+{
+
+}
+
+void FractureVoronoiSettingsPanel::on_btnApplyFracture_clicked()
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ VoronoiFractureExecutor executor;
+ executor.setCellsCount(voronoi.numSites);
+
+ bool multiplyChunksSelected = false;
+ std::map<BlastAsset*, std::vector<uint32_t>> selectedChunks = SampleManager::ins()->getSelectedChunks();
+ std::map<BlastAsset*, std::vector<uint32_t>>::iterator itrAssetSelectedChunks = selectedChunks.begin();
+
+ if (selectedChunks.size() > 1)
+ {
+ multiplyChunksSelected = true;
+ }
+ else if (selectedChunks.size() == 1 && itrAssetSelectedChunks->second.size() > 1)
+ {
+ multiplyChunksSelected = true;
+ }
+ else if ((selectedChunks.size() == 1 && itrAssetSelectedChunks->second.size() == 0) || (selectedChunks.size() == 0))
+ {
+ return;
+ }
+
+ if (multiplyChunksSelected)
+ {
+ QMessageBox::warning(NULL, "Blast Tool", "Now, this tool can only fracture one chunk!");
+ return;
+ }
+
+ executor.setSourceAsset(itrAssetSelectedChunks->first);
+ executor.setTargetChunk(itrAssetSelectedChunks->second.at(0));
+ executor.execute();
+}
+
+QString FractureVoronoiSettingsPanel::_getTexturePathByName(const QString& name)
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+ BPPStringArray& textureArray = voronoi.textureSites;
+
+ int count = textureArray.arraySizes[0];
+ for (int i = 0; i < count; ++i)
+ {
+ QFileInfo fileInfo(textureArray.buf[i].buf);
+ if (fileInfo.baseName() == name)
+ return textureArray.buf[i].buf;
+ }
+
+ return "";
+}
+
+void FractureVoronoiSettingsPanel::_updatePaintMaskComboBox()
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+
+ ui->comboBoxPaintMasks->clear();
+ QStringList items;
+ for (int i = 0; i < voronoi.paintMasks.arraySizes[0]; ++i)
+ {
+ items.append(voronoi.paintMasks.buf[i].buf);
+ }
+ ui->comboBoxPaintMasks->addItems(items);
+ ui->comboBoxPaintMasks->setCurrentIndex(voronoi.activePaintMask);
+}
+
+void FractureVoronoiSettingsPanel::_updateMeshCutterComboBox()
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+
+ ui->comboBoxMeshCutter->clear();
+ QStringList items;
+ for (int i = 0; i < voronoi.meshCutters.arraySizes[0]; ++i)
+ {
+ items.append(voronoi.meshCutters.buf[i].buf);
+ }
+ ui->comboBoxMeshCutter->addItems(items);
+ ui->comboBoxMeshCutter->setCurrentIndex(voronoi.activeMeshCutter);
+}
+
+void FractureVoronoiSettingsPanel::_updateTextureListWidget()
+{
+ BPPVoronoi& voronoi = BlastProject::ins().getParams().fracture.voronoi;
+
+ ui->listWidgetTexture->clear();
+ QStringList items;
+ for (int i = 0; i < voronoi.textureSites.arraySizes[0]; ++i)
+ {
+ QFileInfo fileInfo(voronoi.textureSites.buf[i].buf);
+ QByteArray ba = fileInfo.baseName().toLocal8Bit();
+ const char* texture = (const char*)(ba);
+ items.append(texture);
+ }
+ ui->listWidgetTexture->addItems(items);
+}