diff --git a/code/nel/tools/3d/object_viewer_qt/src/particle_system_form.ui b/code/nel/tools/3d/object_viewer_qt/src/particle_system_form.ui index 6e898a7ec..6f5633731 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/particle_system_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/particle_system_form.ui @@ -905,5 +905,118 @@ - + + + autoLODCheckBox + toggled(bool) + settingsPushButton + setEnabled(bool) + + + 167 + 166 + + + 283 + 168 + + + + + enablePBBCheckBox + toggled(bool) + bboxGroupBox + setEnabled(bool) + + + 99 + 30 + + + 97 + 52 + + + + + autoCheckBox + toggled(bool) + xDoubleSpinBox + setDisabled(bool) + + + 55 + 62 + + + 66 + 88 + + + + + autoCheckBox + toggled(bool) + yDoubleSpinBox + setDisabled(bool) + + + 60 + 59 + + + 162 + 90 + + + + + autoCheckBox + toggled(bool) + zDoubleSpinBox + setDisabled(bool) + + + 57 + 65 + + + 254 + 90 + + + + + autoCheckBox + toggled(bool) + incBboxPushButton + setDisabled(bool) + + + 75 + 72 + + + 65 + 123 + + + + + autoCheckBox + toggled(bool) + decBboxPushButton + setDisabled(bool) + + + 58 + 63 + + + 108 + 120 + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.cpp index 2b806fdfb..77ce8ab07 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.cpp @@ -40,78 +40,6 @@ using namespace NLMISC; namespace NLQT { -// WRAPPERS IMPLEMENTATION - -float CTimeThresholdWrapper::get(void) const -{ - NL3D::TAnimationTime t; - uint32 max; - bool csd; - bool klt; - PS->getAccurateIntegrationParams(t, max, csd, klt); - return t; -} - -void CTimeThresholdWrapper::set(const float &tt) -{ - NL3D::TAnimationTime t; - uint32 max; - bool csd; - bool klt; - PS->getAccurateIntegrationParams(t, max, csd, klt); - PS->setAccurateIntegrationParams(tt, max, csd, klt); -} - -uint32 CMaxNbIntegrationWrapper::get(void) const -{ - NL3D::TAnimationTime t; - uint32 max; - bool csd; - bool klt; - PS->getAccurateIntegrationParams(t, max, csd, klt); - return max; -} - -void CMaxNbIntegrationWrapper::set(const uint32 &nmax) -{ - NL3D::TAnimationTime t; - uint32 max; - bool csd; - bool klt; - PS->getAccurateIntegrationParams(t, max, csd, klt); - PS->setAccurateIntegrationParams(t, nmax, csd, klt); -} - -float CUserParamWrapper::get(void) const -{ - return PS->getUserParam(Index); -} - -void CUserParamWrapper::set(const float &v) -{ - PS->setUserParam(Index, v); -} - -float CMaxViewDistWrapper::get(void) const -{ - return PS->getMaxViewDist(); -} - -void CMaxViewDistWrapper::set(const float &d) -{ - PS->setMaxViewDist(d); -} - -float CLODRatioWrapper::get(void) const -{ - return PS->getLODRatio(); -} - -void CLODRatioWrapper::set(const float &v) -{ - PS->setLODRatio(v); -} - static void chooseGlobalUserParam(uint userParam, NL3D::CParticleSystem *ps, QWidget *parent) { nlassert(ps); @@ -131,40 +59,32 @@ CParticleSystemPage::CParticleSystemPage(QWidget *parent) _ui.timeThresholdWidget->setRange(0.005f, 0.3f); _ui.timeThresholdWidget->enableLowerBound(0, true); - _ui.timeThresholdWidget->setWrapper(&_TimeThresholdWrapper); _ui.maxStepsWidget->setRange(0, 4); _ui.maxStepsWidget->enableLowerBound(0, true); - _ui.maxStepsWidget->setWrapper(&_MaxNbIntegrationWrapper); _ui.userParamWidget_1->setRange(0, 1.0f); _ui.userParamWidget_1->enableLowerBound(0, false); _ui.userParamWidget_1->enableUpperBound(1, false); - _ui.userParamWidget_1->setWrapper(&_UserParamWrapper[0]); _ui.userParamWidget_2->setRange(0, 1.0f); _ui.userParamWidget_2->enableLowerBound(0, false); _ui.userParamWidget_2->enableUpperBound(1, false); - _ui.userParamWidget_2->setWrapper(&_UserParamWrapper[1]); _ui.userParamWidget_3->setRange(0, 1.0f); _ui.userParamWidget_3->enableLowerBound(0, false); _ui.userParamWidget_3->enableUpperBound(1, false); - _ui.userParamWidget_3->setWrapper(&_UserParamWrapper[2]); _ui.userParamWidget_4->setRange(0, 1.0f); _ui.userParamWidget_4->enableLowerBound(0, false); _ui.userParamWidget_4->enableUpperBound(1, false); - _ui.userParamWidget_4->setWrapper(&_UserParamWrapper[3]); _ui.maxViewDistWidget->setRange(0, 400.f); _ui.maxViewDistWidget->enableLowerBound(0, true); - _ui.maxViewDistWidget->setWrapper(&_MaxViewDistWrapper); _ui.lodRatioWidget->setRange(0, 1.f); _ui.lodRatioWidget->enableLowerBound(0, true); _ui.lodRatioWidget->enableUpperBound(1, true); - _ui.lodRatioWidget->setWrapper(&_LODRatioWrapper); _ui.colorWidget->setSchemeWrapper(&_GlobalColorWrapper); _ui.colorWidget->enableMemoryScheme(false); @@ -173,19 +93,28 @@ CParticleSystemPage::CParticleSystemPage(QWidget *parent) _ui.colorWidget->setEnabledConstantValue(false); _ui.colorWidget->init(); _ui.colorWidget->hide(); - - for (uint k = 0; k < NL3D::MaxPSUserParam; ++k) - _UserParamWrapper[k].Index = k; - connect(_ui.globalLightCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setGlobalLight(bool))); + // Integration tab connect(_ui.loadBalancingCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setLoadBalancing(bool))); connect(_ui.integrationCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setIntegration(bool))); connect(_ui.motionSlowDownCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setMotionSlowDown(bool))); connect(_ui.lockPushButton ,SIGNAL(toggled(bool)), this, SLOT(setLock(bool))); + + connect(_ui.timeThresholdWidget ,SIGNAL(valueChanged(float)), this, SLOT(setTimeThreshold(float))); + connect(_ui.maxStepsWidget ,SIGNAL(valueChanged(uint32)), this, SLOT(setMaxSteps(uint32))); + + // User param tab connect(_ui.globalPushButton_1 ,SIGNAL(clicked()), this, SLOT(setGloabal1())); connect(_ui.globalPushButton_2 ,SIGNAL(clicked()), this, SLOT(setGloabal2())); connect(_ui.globalPushButton_3 ,SIGNAL(clicked()), this, SLOT(setGloabal3())); connect(_ui.globalPushButton_4 ,SIGNAL(clicked()), this, SLOT(setGloabal4())); + + connect(_ui.userParamWidget_1 ,SIGNAL(valueChanged(float)), this, SLOT(setUserParam1(float))); + connect(_ui.userParamWidget_2 ,SIGNAL(valueChanged(float)), this, SLOT(setUserParam2(float))); + connect(_ui.userParamWidget_3 ,SIGNAL(valueChanged(float)), this, SLOT(setUserParam3(float))); + connect(_ui.userParamWidget_4 ,SIGNAL(valueChanged(float)), this, SLOT(setUserParam4(float))); + + // BBox tab connect(_ui.enablePBBCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setEnableBbox(bool))); connect(_ui.autoCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setAutoBbox(bool))); connect(_ui.resetPushButton ,SIGNAL(clicked()), this, SLOT(resetBbox())); @@ -194,11 +123,21 @@ CParticleSystemPage::CParticleSystemPage(QWidget *parent) connect(_ui.xDoubleSpinBox ,SIGNAL(valueChanged(double)), this, SLOT(setXBbox(double))); connect(_ui.yDoubleSpinBox ,SIGNAL(valueChanged(double)), this, SLOT(setYBbox(double))); connect(_ui.zDoubleSpinBox ,SIGNAL(valueChanged(double)), this, SLOT(setZBbox(double))); - connect(_ui.editGlobalColorCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setEditGlobalColor(bool))); - connect(_ui.presetBehaviourComboBox ,SIGNAL(currentIndexChanged(int)), this, SLOT(setPresetBehaviour(int))); + + // LOD param tab connect(_ui.sharableCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setSharable(bool))); connect(_ui.autoLODCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setAutoLOD(bool))); connect(_ui.settingsPushButton ,SIGNAL(clicked()), this, SLOT(settings())); + + connect(_ui.maxViewDistWidget ,SIGNAL(valueChanged(float)), this, SLOT(setMaxViewDist(float))); + connect(_ui.lodRatioWidget ,SIGNAL(valueChanged(float)), this, SLOT(setLodRatio(float))); + + // Global color tab + connect(_ui.editGlobalColorCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setEditGlobalColor(bool))); + connect(_ui.globalLightCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setGlobalLight(bool))); + + // Life mgt param tab + connect(_ui.presetBehaviourComboBox ,SIGNAL(currentIndexChanged(int)), this, SLOT(setPresetBehaviour(int))); connect(_ui.modelRemovedCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setModelRemoved(bool))); connect(_ui.psResourceCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setPSResource(bool))); connect(_ui.lifeTimeUpdateCheckBox ,SIGNAL(toggled(bool)), this, SLOT(setLifeTimeUpdate(bool))); @@ -207,6 +146,8 @@ CParticleSystemPage::CParticleSystemPage(QWidget *parent) connect(_ui.animTypeComboBox ,SIGNAL(currentIndexChanged(int)), this, SLOT(setAnimType(int))); connect(_ui.dieComboBox ,SIGNAL(currentIndexChanged(int)), this, SLOT(setDie(int))); connect(_ui.afterDelaySpinBox ,SIGNAL(valueChanged(double)), this, SLOT(setAfterDelay(double))); + + enabledModifiedFlag = true; } CParticleSystemPage::~CParticleSystemPage() @@ -216,54 +157,43 @@ CParticleSystemPage::~CParticleSystemPage() void CParticleSystemPage::setEditedParticleSystem(CWorkspaceNode *node) { _Node = node; - // load settings Time threshold. - _TimeThresholdWrapper.OwnerNode = _Node; - _TimeThresholdWrapper.PS = _Node->getPSPointer(); - _ui.timeThresholdWidget->updateUi(); - - // load settings Max steps. - _MaxNbIntegrationWrapper.OwnerNode = _Node; - _MaxNbIntegrationWrapper.PS = _Node->getPSPointer(); - _ui.maxStepsWidget->updateUi(); - - // load settings User Param - for (uint k = 0; k < NL3D::MaxPSUserParam; ++k) - { - _UserParamWrapper[k].OwnerNode = _Node; - _UserParamWrapper[k].PS = _Node->getPSPointer(); - } - - _ui.userParamWidget_1->updateUi(); - _ui.userParamWidget_2->updateUi(); - _ui.userParamWidget_3->updateUi(); - _ui.userParamWidget_4->updateUi(); - - // load settings Max view dist. - _MaxViewDistWrapper.OwnerNode = _Node; - _MaxViewDistWrapper.PS = _Node->getPSPointer(); - _ui.maxViewDistWidget->updateUi(); - - // load settings LOD Ratio. - _LODRatioWrapper.OwnerNode = _Node; - _LODRatioWrapper.PS = _Node->getPSPointer(); - _ui.lodRatioWidget->updateUi(); - - // Integration - _ui.integrationCheckBox->setChecked(_Node->getPSPointer()->isAccurateIntegrationEnabled()); - _ui.loadBalancingCheckBox->setChecked(_Node->getPSPointer()->isLoadBalancingEnabled()); - _ui.globalLightCheckBox->setChecked(_Node->getPSPointer()->getForceGlobalColorLightingFlag()); - + enabledModifiedFlag = false; + NL3D::TAnimationTime t; uint32 max; bool csd; bool klt; _Node->getPSPointer()->getAccurateIntegrationParams(t, max, csd, klt); + + // Update param Time threshold. + _ui.timeThresholdWidget->setValue(t, false); + + // Update param Max steps. + _ui.maxStepsWidget->setValue(max, false); + + // Update param User Param + _ui.userParamWidget_1->setValue(_Node->getPSPointer()->getUserParam(0) , false); + _ui.userParamWidget_2->setValue(_Node->getPSPointer()->getUserParam(1) , false); + _ui.userParamWidget_3->setValue(_Node->getPSPointer()->getUserParam(2) , false); + _ui.userParamWidget_4->setValue(_Node->getPSPointer()->getUserParam(3) , false); + + // Update param Max view dist. + _ui.maxViewDistWidget->setValue(_Node->getPSPointer()->getMaxViewDist(), false); + + // Update param LOD Ratio. + _ui.lodRatioWidget->setValue(_Node->getPSPointer()->getLODRatio(), false); + + // Integration + _ui.integrationCheckBox->setChecked(_Node->getPSPointer()->isAccurateIntegrationEnabled()); + _ui.loadBalancingCheckBox->setChecked(_Node->getPSPointer()->isLoadBalancingEnabled()); _ui.motionSlowDownCheckBox->setChecked(csd); // Precomputed Bbox _ui.enablePBBCheckBox->setChecked(!_Node->getPSPointer()->getAutoComputeBBox()); // global color + _ui.globalLightCheckBox->setChecked(_Node->getPSPointer()->getForceGlobalColorLightingFlag()); + _GlobalColorWrapper.PS = _Node->getPSPointer(); _ui.colorWidget->setWorkspaceNode(_Node); int bGlobalColor = _Node->getPSPointer()->getColorAttenuationScheme() != NULL ? 1 : 0; @@ -284,6 +214,8 @@ void CParticleSystemPage::setEditedParticleSystem(CWorkspaceNode *node) _ui.dieComboBox->setCurrentIndex(_Node->getPSPointer()->getDestroyCondition()); _ui.animTypeComboBox->setCurrentIndex(_Node->getPSPointer()->getAnimType()); _ui.autoDelayCheckBox->setChecked(_Node->getPSPointer()->getAutoComputeDelayBeforeDeathConditionTest()); + + enabledModifiedFlag = true; } void CParticleSystemPage::updatePrecomputedBBoxParams() @@ -418,17 +350,11 @@ void CParticleSystemPage::setEnableBbox(bool state) updatePrecomputedBBoxParams(); else Modules::psEdit().setAutoBBox(false); - _ui.bboxGroupBox->setEnabled(state); } void CParticleSystemPage::setAutoBbox(bool state) { Modules::psEdit().setAutoBBox(state); - _ui.xDoubleSpinBox->setEnabled(!state); - _ui.yDoubleSpinBox->setEnabled(!state); - _ui.zDoubleSpinBox->setEnabled(!state); - _ui.incBboxPushButton->setEnabled(!state); - _ui.decBboxPushButton->setEnabled(!state); updateModifiedFlag(); } @@ -556,7 +482,6 @@ void CParticleSystemPage::setSharable(bool state) void CParticleSystemPage::setAutoLOD(bool state) { - _ui.settingsPushButton->setEnabled(state); // performance warning if (state == _Node->getPSPointer()->isAutoLODEnabled()) return; _Node->getPSPointer()->enableAutoLOD(state); @@ -653,6 +578,65 @@ void CParticleSystemPage::setAfterDelay(double value) } } + +void CParticleSystemPage::setTimeThreshold(float value) +{ + NL3D::TAnimationTime t; + uint32 max; + bool csd; + bool klt; + _Node->getPSPointer()->getAccurateIntegrationParams(t, max, csd, klt); + _Node->getPSPointer()->setAccurateIntegrationParams(value, max, csd, klt); + updateModifiedFlag(); +} + +void CParticleSystemPage::setMaxSteps(uint32 value) +{ + NL3D::TAnimationTime t; + uint32 max; + bool csd; + bool klt; + _Node->getPSPointer()->getAccurateIntegrationParams(t, max, csd, klt); + _Node->getPSPointer()->setAccurateIntegrationParams(t, value, csd, klt); + updateModifiedFlag(); +} + +void CParticleSystemPage::setUserParam1(float value) +{ + _Node->getPSPointer()->setUserParam(0, value); + updateModifiedFlag(); +} + +void CParticleSystemPage::setUserParam2(float value) +{ + _Node->getPSPointer()->setUserParam(1, value); + updateModifiedFlag(); +} + +void CParticleSystemPage::setUserParam3(float value) +{ + _Node->getPSPointer()->setUserParam(2, value); + updateModifiedFlag(); +} + +void CParticleSystemPage::setUserParam4(float value) +{ + _Node->getPSPointer()->setUserParam(3, value); + updateModifiedFlag(); +} + +void CParticleSystemPage::setMaxViewDist(float value) +{ + _Node->getPSPointer()->setMaxViewDist(value); + updateModifiedFlag(); +} + +void CParticleSystemPage::setLodRatio(float value) +{ + _Node->getPSPointer()->setLODRatio(value); + updateModifiedFlag(); +} + CParticleSystemPage::CGlobalColorWrapper::scheme_type *CParticleSystemPage::CGlobalColorWrapper::getScheme(void) const { nlassert(PS); @@ -661,6 +645,7 @@ CParticleSystemPage::CGlobalColorWrapper::scheme_type *CParticleSystemPage::CGlo void CParticleSystemPage::CGlobalColorWrapper::setScheme(CParticleSystemPage::CGlobalColorWrapper::scheme_type *s) { + nlassert(PS); PS->setColorAttenuationScheme(s); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.h b/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.h index 9680b2508..647e729e3 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/particle_system_page.h @@ -34,48 +34,6 @@ #include "edit_range_widget.h" namespace NLQT { - -class CUserParamWrapper : public IPSWrapperFloat -{ -public: - NL3D::CParticleSystem *PS; - uint32 Index; - float get(void) const; - void set(const float &v); -}; - -class CTimeThresholdWrapper : public IPSWrapperFloat -{ -public: - NL3D::CParticleSystem *PS; - float get(void) const; - void set(const float &); -}; - -class CMaxNbIntegrationWrapper : public IPSWrapperUInt -{ -public: - NL3D::CParticleSystem *PS; - uint32 get(void) const; - void set(const uint32 &); -}; - -class CMaxViewDistWrapper : public IPSWrapperFloat -{ -public: - NL3D::CParticleSystem *PS; - float get(void) const; - void set(const float &); -}; - -class CLODRatioWrapper : public IPSWrapperFloat -{ -public: - NL3D::CParticleSystem *PS; - float get(void) const; - void set(const float &); -}; - /** @class CParticleSystemPage @brief Page for QStackWidget, to edit workspace node in a particle system @@ -92,15 +50,27 @@ public: void setEditedParticleSystem(CWorkspaceNode *node); private Q_SLOTS: - void setGlobalLight(bool state); + // Integration tab void setLoadBalancing(bool state); void setIntegration(bool state); void setMotionSlowDown(bool state); void setLock(bool checked); + + void setTimeThreshold(float value); + void setMaxSteps(uint32 value); + + // User param tab void setGloabal1(); void setGloabal2(); void setGloabal3(); void setGloabal4(); + + void setUserParam1(float value); + void setUserParam2(float value); + void setUserParam3(float value); + void setUserParam4(float value); + + // BBox tab void setEnableBbox(bool state); void setAutoBbox(bool state); void resetBbox(); @@ -109,11 +79,21 @@ private Q_SLOTS: void setXBbox(double value); void setYBbox(double value); void setZBbox(double value); - void setEditGlobalColor(bool state); - void setPresetBehaviour(int index); + + // LOD Param void setSharable(bool state); void setAutoLOD(bool state); void settings(); + + void setMaxViewDist(float value); + void setLodRatio(float value); + + // Global color tab + void setGlobalLight(bool state); + void setEditGlobalColor(bool state); + + // Life mgt param + void setPresetBehaviour(int index); void setModelRemoved(bool state); void setPSResource(bool state); void setLifeTimeUpdate(bool state); @@ -128,17 +108,12 @@ private: void updateDieOnEventParams(); void updateLifeMgtPresets(); - void updateModifiedFlag() { if (_Node) _Node->setModified(true); } + bool enabledModifiedFlag; + + void updateModifiedFlag() { if ((_Node) && (enabledModifiedFlag)) _Node->setModified(true); } CWorkspaceNode *_Node; - CTimeThresholdWrapper _TimeThresholdWrapper; - CMaxViewDistWrapper _MaxViewDistWrapper; - CMaxNbIntegrationWrapper _MaxNbIntegrationWrapper; - CLODRatioWrapper _LODRatioWrapper; - /// wrapper to tune user parameters - CUserParamWrapper _UserParamWrapper[NL3D::MaxPSUserParam]; - struct CGlobalColorWrapper : public IPSSchemeWrapperRGBA { NL3D::CParticleSystem *PS;