diff options
| author | Anton Novoselov <[email protected]> | 2017-08-01 12:53:38 +0300 |
|---|---|---|
| committer | Anton Novoselov <[email protected]> | 2017-08-01 12:53:38 +0300 |
| commit | 236f03c0b9a4982328ed1201978f7f69d192d9b2 (patch) | |
| tree | e486f2fa39dba203563895541e92c60ed3e25759 /tools/ArtistTools/source/BlastPlugin/Window/FractureSliceSettingsPanel.cpp | |
| parent | Added screens to welcome page (diff) | |
| download | blast-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.cpp | 189 |
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; } |