aboutsummaryrefslogtreecommitdiff
path: root/tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp
diff options
context:
space:
mode:
authorAnton Novoselov <[email protected]>2017-08-01 12:53:38 +0300
committerAnton Novoselov <[email protected]>2017-08-01 12:53:38 +0300
commit236f03c0b9a4982328ed1201978f7f69d192d9b2 (patch)
treee486f2fa39dba203563895541e92c60ed3e25759 /tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp
parentAdded screens to welcome page (diff)
downloadblast-236f03c0b9a4982328ed1201978f7f69d192d9b2.tar.xz
blast-236f03c0b9a4982328ed1201978f7f69d192d9b2.zip
Blast 1.1 release (windows / linux)
see docs/release_notes.txt for details
Diffstat (limited to 'tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp')
-rw-r--r--tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp189
1 files changed, 141 insertions, 48 deletions
diff --git a/tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp b/tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp
index fa82ee2..103c01c 100644
--- a/tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp
+++ b/tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp
@@ -1,13 +1,16 @@
#include "FractureSliceSettingsPanel.h"
#include "ui_FractureSliceSettingsPanel.h"
-#include "ProjectParams.h"
#include "SimpleScene.h"
#include "SampleManager.h"
#include <QtWidgets/QMessageBox>
+#include "FractureGeneralPanel.h"
+#include "BlastFamily.h"
FractureSliceSettingsPanel::FractureSliceSettingsPanel(QWidget *parent) :
QWidget(parent),
- ui(new Ui::FractureSliceSettingsPanel)
+ ui(new Ui::FractureSliceSettingsPanel),
+ _updateData(true),
+ _generalPanel(nullptr)
{
ui->setupUi(this);
}
@@ -19,87 +22,177 @@ FractureSliceSettingsPanel::~FractureSliceSettingsPanel()
void FractureSliceSettingsPanel::updateValues()
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
-
- ui->spinBoxNumSlices->setValue(slice.numSlices);
- ui->spinBoxOffsetVariation->setValue(slice.offsetVariation);
- ui->spinBoxRotationVariation->setValue(slice.rotationVariation);
- ui->spinBoxNoiseAmplitude->setValue(slice.noiseAmplitude);
- ui->spinBoxNoiseFrequency->setValue(slice.noiseFrequency);
- ui->spinBoxNoiseSeed->setValue(slice.noiseSeed);
+ _updateData = false;
+ BPPSlice* slice = _getBPPSlice();
+
+ ui->spinBoxNumSlicesX->setValue(slice->numSlicesX);
+ ui->spinBoxNumSlicesY->setValue(slice->numSlicesY);
+ ui->spinBoxNumSlicesZ->setValue(slice->numSlicesZ);
+ ui->spinBoxOffsetVariation->setValue(slice->offsetVariation);
+ ui->spinBoxRotationVariation->setValue(slice->rotationVariation);
+ ui->spinBoxNoiseAmplitude->setValue(slice->noiseAmplitude);
+ ui->spinBoxNoiseFrequency->setValue(slice->noiseFrequency);
+ ui->spinBoxNoiseOctaveNumber->setValue(slice->noiseOctaveNumber);
+ ui->spinBoxNoiseSeed->setValue(slice->noiseSeed);
+ ui->spinBoxSurfaceResolution->setValue(slice->surfaceResolution);
+ _updateData = true;
}
-void FractureSliceSettingsPanel::on_spinBoxNumSlices_valueChanged(int arg1)
+void FractureSliceSettingsPanel::on_spinBoxNumSlicesX_valueChanged(int arg1)
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
- slice.numSlices = arg1;
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->numSlicesX = arg1;
+}
+
+void FractureSliceSettingsPanel::on_spinBoxNumSlicesY_valueChanged(int arg1)
+{
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->numSlicesY = arg1;
+}
+
+void FractureSliceSettingsPanel::on_spinBoxNumSlicesZ_valueChanged(int arg1)
+{
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->numSlicesZ = arg1;
}
void FractureSliceSettingsPanel::on_spinBoxOffsetVariation_valueChanged(double arg1)
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
- slice.offsetVariation = arg1;
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->offsetVariation = arg1;
}
void FractureSliceSettingsPanel::on_spinBoxRotationVariation_valueChanged(double arg1)
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
- slice.rotationVariation = arg1;
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->rotationVariation = arg1;
}
void FractureSliceSettingsPanel::on_spinBoxNoiseAmplitude_valueChanged(double arg1)
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
- slice.noiseAmplitude = arg1;
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->noiseAmplitude = arg1;
}
void FractureSliceSettingsPanel::on_spinBoxNoiseFrequency_valueChanged(double arg1)
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
- slice.noiseFrequency = arg1;
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->noiseFrequency = arg1;
+}
+
+void FractureSliceSettingsPanel::on_spinBoxNoiseOctaveNumber_valueChanged(int arg1)
+{
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->noiseOctaveNumber = arg1;
}
void FractureSliceSettingsPanel::on_spinBoxNoiseSeed_valueChanged(int arg1)
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
- slice.noiseSeed = arg1;
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->noiseSeed = arg1;
+}
+
+void FractureSliceSettingsPanel::on_spinBoxSurfaceResolution_valueChanged(int arg1)
+{
+ if (!_updateData)
+ return;
+
+ BPPSlice* slice = _getBPPSlice();
+ slice->surfaceResolution = arg1;
}
void FractureSliceSettingsPanel::on_btnApplyFracture_clicked()
{
- BPPSlice& slice = BlastProject::ins().getParams().fracture.slice;
+ BPPSlice* slice = _getBPPSlice();
SliceFractureExecutor executor;
- executor.applyNoise(slice.noiseAmplitude, slice.noiseAmplitude, 0, 0, 0, slice.noiseSeed);
- executor.applyConfig(slice.numSlices, slice.numSlices, slice.numSlices, slice.offsetVariation, slice.rotationVariation);
+ executor.setBPPSlice(slice);
+
+ SampleManager* pSampleManager = SampleManager::ins();
+ std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = pSampleManager->getAssetFamiliesMap();
+ std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap();
+ BPParams& projectParams = BlastProject::ins().getParams();
+ BPPGraphicsMaterialArray& theArray = projectParams.graphicsMaterials;
+ BPPFractureGeneral& fractureGeneral = projectParams.fracture.general;
+ int32_t nMaterialIndex = fractureGeneral.applyMaterial;
+ std::string materialName = "";
+ RenderMaterial* pRenderMaterial = nullptr;
+ if (nMaterialIndex > 0)
+ {
+ BPPGraphicsMaterial& item = theArray.buf[nMaterialIndex - 1];
+ materialName = item.name.buf;
+ pRenderMaterial = pSampleManager->getRenderMaterial(materialName);
+ }
- 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)
+ for (; itrAssetSelectedChunks != selectedChunks.end(); itrAssetSelectedChunks++)
{
- multiplyChunksSelected = true;
+ if (itrAssetSelectedChunks->second.size() == 0)
+ {
+ continue;
+ }
+
+ if (pRenderMaterial != nullptr)
+ {
+ BlastAsset* pBlastAsset = itrAssetSelectedChunks->first;
+ std::vector<BlastFamily*> families = AssetFamiliesMap[pBlastAsset];
+ int familySize = families.size();
+ for (int fs = 0; fs < familySize; fs++)
+ {
+ BlastFamily* pBlastFamily = families[fs];
+ pBlastFamily->setMaterial(pRenderMaterial, false);
+
+ AssetList::ModelAsset modelAsset = AssetDescMap[pBlastAsset];
+ int assetID = BlastProject::ins().getAssetIDByName(modelAsset.name.c_str());
+ BPPAssetInstance* instance = BlastProject::ins().getAssetInstance(assetID, fs);
+ copy(instance->inMaterial, materialName.c_str());
+ }
+ }
+
+ executor.setSourceAsset(itrAssetSelectedChunks->first);
+ executor.setTargetChunks(itrAssetSelectedChunks->second);
+ executor.execute();
}
- else if (selectedChunks.size() == 1 && itrAssetSelectedChunks->second.size() > 1)
+}
+
+BPPSlice* FractureSliceSettingsPanel::_getBPPSlice()
+{
+ BPPSlice* slice = nullptr;
+ FracturePreset* preset = _generalPanel->getCurrentFracturePreset();
+ if (nullptr != preset)
{
- multiplyChunksSelected = true;
+ slice = &(preset->fracture.slice);
}
- else if((selectedChunks.size() == 1 && itrAssetSelectedChunks->second.size() == 0) || (selectedChunks.size() == 0))
+ else
{
- return;
+ slice = &(BlastProject::ins().getParams().fracture.slice);
}
-
- 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();
-
- //VoronoiFractureExecutor executor;
- //executor.setTargetChunk(0);
- //executor.execute();
+ return slice;
}