From 6150882794a30872307b5bcb453e043fe5ec5035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Thu, 13 Oct 2022 17:00:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- glscene.cpp | 1 + glwidget.cpp | 20 ---------- glwidget.h | 4 -- openglwindow.cpp | 22 +++++------ openglwindow.h | 4 +- qglview.cpp | 24 +++++------- qglview.h | 20 ++++------ qglview_test/qglview_window.cpp | 1 - renderer.cpp | 9 +++-- renderer_material.cpp | 2 +- widgets/scene_tree.cpp | 30 +++++++++++--- widgets/scene_tree.h | 1 + widgets/scene_tree.ui | 36 ++++++++++------- widgets/treewidget_p.h | 10 +++++ widgets/view_editor.cpp | 30 ++++++++++---- widgets/view_editor.h | 4 +- widgets/view_editor.ui | 69 +++++++++++---------------------- 17 files changed, 142 insertions(+), 145 deletions(-) diff --git a/glscene.cpp b/glscene.cpp index 0de050c..3d95e64 100644 --- a/glscene.cpp +++ b/glscene.cpp @@ -75,6 +75,7 @@ void Scene::addScene(const Scene * s) { void Scene::assignFrom(const Scene * s) { clear(); + if (!s) return; setName(s->name()); foreach (Material * m, s->materials) { Material * nm = new Material(); diff --git a/glwidget.cpp b/glwidget.cpp index 29bde34..03e72da 100644 --- a/glwidget.cpp +++ b/glwidget.cpp @@ -35,11 +35,6 @@ GLWidget::GLWidget(QWidget *parent) : QWidget(parent) { } -QColor GLWidget::backColor() const { - return view_->backColor(); -} - - qreal GLWidget::lineWidth() const { return view_->lineWidth(); } @@ -55,11 +50,6 @@ qreal GLWidget::depthStart() const { } -QColor GLWidget::ambientColor() const { - return view_->ambientColor(); -} - - bool GLWidget::isLightEnabled() const { return view_->isLightEnabled(); } @@ -146,11 +136,6 @@ void GLWidget::start(float freq) { } -void GLWidget::setBackColor(const QColor & c) { - view_->setBackColor(c); -} - - void GLWidget::setLineWidth(const qreal & arg) { view_->setLineWidth(arg); } @@ -166,11 +151,6 @@ void GLWidget::setDepthStart(const qreal & arg) { } -void GLWidget::setAmbientColor(const QColor & arg) { - view_->setAmbientColor(arg); -} - - void GLWidget::setLightEnabled(const bool & arg) { view_->setLightEnabled(arg); } diff --git a/glwidget.h b/glwidget.h index 1f1c03c..e65c090 100644 --- a/glwidget.h +++ b/glwidget.h @@ -29,11 +29,9 @@ class Scene; class GLWidget : public QWidget { Q_OBJECT - Q_PROPERTY (QColor backColor READ backColor WRITE setBackColor) Q_PROPERTY (qreal lineWidth READ lineWidth WRITE setLineWidth) Q_PROPERTY (qreal FOV READ FOV WRITE setFOV) Q_PROPERTY (qreal depthStart READ depthStart WRITE setDepthStart) - Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY (bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled) Q_PROPERTY (bool mouseRotate READ isMouseRotateEnabled WRITE setMouseRotateEnabled) Q_PROPERTY (bool mouseSelection READ isMouseSelectionEnabled WRITE setMouseSelectionEnabled) @@ -73,11 +71,9 @@ public: public slots: void stop(); void start(float freq = 0.0); - void setBackColor(const QColor & c); void setLineWidth(const qreal & arg); void setFOV(const qreal & arg); void setDepthStart(const qreal & arg); - void setAmbientColor(const QColor & arg); void setLightEnabled(const bool & arg); void setGrabMouseEnabled(const bool & arg); void setMouseRotateEnabled(const bool & arg); diff --git a/openglwindow.cpp b/openglwindow.cpp index 49380c5..48c401c 100644 --- a/openglwindow.cpp +++ b/openglwindow.cpp @@ -68,19 +68,19 @@ bool OpenGLWindow::getVSync() const { } -void OpenGLWindow::setSamples(int samples) { - QSurfaceFormat f = requestedFormat(); - if (f.samples() != samples) { - f.setSamples(samples); - setFormat(f); - format_change = true; - } -} +//void OpenGLWindow::setSamples(int samples) { +// QSurfaceFormat f = requestedFormat(); +// if (f.samples() != samples) { +// f.setSamples(samples); +// setFormat(f); +// format_change = true; +// } +//} -int OpenGLWindow::getSamples() const { - return requestedFormat().samples(); -} +//int OpenGLWindow::getSamples() const { +// return requestedFormat().samples(); +//} void OpenGLWindow::renderNow() { diff --git a/openglwindow.h b/openglwindow.h index 64bee41..36f4e45 100644 --- a/openglwindow.h +++ b/openglwindow.h @@ -18,8 +18,8 @@ public: QOpenGLContext * context() {return m_context;} void setVSync(bool on); bool getVSync() const; - void setSamples(int samples); - int getSamples() const; +// void setSamples(int samples); +// int getSamples() const; int getFrameCounter() const {return frame_cnt;} public slots: diff --git a/qglview.cpp b/qglview.cpp index 978214b..75a4d81 100644 --- a/qglview.cpp +++ b/qglview.cpp @@ -30,13 +30,10 @@ using namespace QGLEngineShaders; QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) { setIcon(QIcon(":/icons/qglview.png")); - deleting_ = false; + is_init = false; timer = 0; - need_init_ = is_first_draw = true; - backColor_ = Qt::darkGray; hoverHaloColor_ = QColor(195, 140, 255); selectionHaloColor_ = QColor(175, 255, 140); - ambientColor_ = QColor(10, 10, 10); lineWidth_ = 1.; max_anisotropic = 1; max_texture_chanels = 8; @@ -74,7 +71,7 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) { setFeature(qglDepthOfFieldFocus, 1.); setFeature(qglDepthOfFieldDiaphragm, 8.); hoverHalo_ = selectionHalo_ = true; - fogEnabled_ = is_init = shaders_bind = changed_ = false; + fogEnabled_ = shaders_bind = false; rmode = ObjectBase::Fill; scene_ = new Scene(); connect(scene_, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged())); @@ -87,7 +84,6 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) { // qDebug() << camera_->aim(); default_camera->setName("Camera"); emit cameraPosChanged(default_camera->pos()); - ktm_.restart(); Mesh * m = Primitive::cube(10, 10, 10); m->flipNormals(); @@ -99,7 +95,6 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this), mouse(this) { QGLView::~QGLView() { - deleting_ = true; stop(); scene_->clear(); delete scene_; @@ -130,9 +125,9 @@ QList QGLView::selectedLights() const { QList QGLView::selectedCameras() const { QList ret; ObjectBaseList sol = scene_->selectedObjects(); - foreach (ObjectBase * o, sol) - if (o->type() == ObjectBase::glCamera) - ret << (Camera*)o; + for (ObjectBase * o : sol) { + if (o->type() == ObjectBase::glCamera) ret << (Camera*)o; + } return ret; } @@ -185,7 +180,6 @@ void QGLView::initialize() { renderer_.init(width(), height()); scene_->reinitAll(); is_init = true; - need_init_ = false; prev_size = QSize(); emit glInitializeDone(); } @@ -204,8 +198,7 @@ void QGLView::__destroyed() { void QGLView::__objectDeleted(ObjectBase * o) { - if (o == camera_) - setDefaultCamera(); + if (o == camera_) setDefaultCamera(); } @@ -253,7 +246,7 @@ void QGLView::focusOn(const Box3D & bb) { QByteArray QGLView::saveCamera() { ChunkStream cs; - const Camera * c = camera(); + const Camera * c = default_camera; cs.add(1, c->pos()).add(2, c->aim()).add(3, c->rotation()).add(4, c->FOV()); return cs.data(); } @@ -261,7 +254,8 @@ QByteArray QGLView::saveCamera() { void QGLView::restoreCamera(const QByteArray & ba) { if (ba.isEmpty()) return; - Camera * c = camera(); + setDefaultCamera(); + Camera * c = default_camera; QVector3D pos(c->pos()), aim(c->aim()), ang(c->rotation()); float fov(c->FOV()); ChunkStream cs(ba); diff --git a/qglview.h b/qglview.h index 4ffc97e..b694186 100644 --- a/qglview.h +++ b/qglview.h @@ -34,13 +34,11 @@ class QGLView: public OpenGLWindow { friend class RendererSelection; Q_OBJECT - Q_PROPERTY (QColor backColor READ backColor WRITE setBackColor) Q_PROPERTY (float lineWidth READ lineWidth WRITE setLineWidth) Q_PROPERTY (float FOV READ FOV WRITE setFOV) Q_PROPERTY (float depthStart READ depthStart WRITE setDepthStart) Q_PROPERTY (float gamma READ gamma WRITE setGamma) Q_PROPERTY (bool autoExposure READ autoExposure WRITE setAutoExposure) - Q_PROPERTY (QColor ambientColor READ ambientColor WRITE setAmbientColor) Q_PROPERTY (QColor fogColor READ fogColor WRITE setFogColor) Q_PROPERTY (bool fogEnabled READ isFogEnabled WRITE setFogEnabled) Q_PROPERTY (float fogDensity READ fogDensity WRITE setFogDensity) @@ -102,7 +100,6 @@ public: void stop(); void start(float freq = 0.); - QColor backColor() const {return backColor_;} float lineWidth() const {return lineWidth_;} float FOV() const {return camera()->FOV();} float depthStart() const {return camera()->depthStart();} @@ -112,7 +109,6 @@ public: int maxAnisotropicLevel() const {return max_anisotropic;} QString environmentMapFile() const {return renderer_.tex_env.fileHDR();} - QColor ambientColor() const {return ambientColor_;} QColor fogColor() const {return fogColor_;} float fogDensity() const {return fogDensity_;} float fogDecay() const {return fogDecay_;} @@ -167,6 +163,7 @@ public: const Camera * camera() const {return camera_;} void setCamera(Camera * camera) {camera_ = camera;} void setDefaultCamera() {camera_ = default_camera;} + bool isDefaultCamera() const {return camera_ == default_camera;} QByteArray saveCamera(); void restoreCamera(const QByteArray & ba); QByteArray saveFeatures(); @@ -209,8 +206,8 @@ private: MouseController mouse; QMenu context_menu; QSet keys_; - QColor backColor_, fogColor_, ambientColor_, hoverHaloColor_, selectionHaloColor_; - QElapsedTimer time, ktm_; + QColor fogColor_, hoverHaloColor_, selectionHaloColor_; + QElapsedTimer time; GLint max_anisotropic, max_texture_chanels; ObjectBase::RenderMode rmode; QHash features_; @@ -218,23 +215,22 @@ private: float lineWidth_; float fps_, fps_tm, fogDensity_, fogDecay_; float hoverHaloFill_, selectionHaloFill_, m_motionBlurFactor; - int timer, fps_cnt, sh_id_loc, deleting_; - bool is_first_draw, is_init, fogEnabled_, lightEnabled_; - bool shaders_supported, changed_, need_init_; - bool hoverHalo_, selectionHalo_, shaders_bind; + int timer, fps_cnt, sh_id_loc; + bool fogEnabled_, lightEnabled_; + bool shaders_supported, shaders_bind; + bool hoverHalo_, selectionHalo_; + bool is_init; private slots: void __destroyed(); void __objectDeleted(ObjectBase * o); public slots: - void setBackColor(const QColor & arg) {backColor_ = arg;} void setLineWidth(const float & arg) {lineWidth_ = arg;} void setFOV(const float & arg) {camera()->setFOV(arg);} void setDepthStart(const float & arg) {camera()->setDepthStart(arg);} void setGamma(const float & arg) {renderer_.gamma_ = arg;} void setAutoExposure(bool arg) {renderer_.tone_proc.enabled = arg;} - void setAmbientColor(const QColor & arg) {ambientColor_ = arg;} void setEnvironmentMapFile(QString file) {renderer_.tex_env.setFileHDR(file); renderer_.recreateMaterialThumbnails(true);} void setFogColor(const QColor & arg) {fogColor_ = arg;} void setFogDensity(const float & arg) {fogDensity_ = arg;} diff --git a/qglview_test/qglview_window.cpp b/qglview_test/qglview_window.cpp index a6ac505..217ac09 100644 --- a/qglview_test/qglview_window.cpp +++ b/qglview_test/qglview_window.cpp @@ -42,7 +42,6 @@ QGLViewWindow::QGLViewWindow(QWidget * parent): QMainWindow(parent), Ui::QGLView view->view()->setMouseSelectionEnabled(true); view->view()->setSelectionHaloEnabled(true); view->view()->setHoverHaloEnabled(true); - view->view()->setBackColor(Qt::lightGray); view->view()->setDepthStart(0.1); view->view()->setSelectionMode(Scene::smMultiSelection); diff --git a/renderer.cpp b/renderer.cpp index f9511d9..11335a3 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -291,8 +291,9 @@ void Renderer::renderScene() { /// lights cur_lights = scene.lights_used; bool use_camlight = (camera_light_mode == QGLView::clmOn); - if ((camera_light_mode == QGLView::clmAuto) && cur_lights.isEmpty()) + if ((camera_light_mode == QGLView::clmAuto) && cur_lights.isEmpty()) { use_camlight = true; + } if (use_camlight) { cur_lights[Light::Omni] << cam_light; cam_light->setPos(cam->pos()); @@ -346,16 +347,16 @@ void Renderer::renderScene() { } /// tonemapping - if (tone_proc.process()) - fbo_out.bind(); + if (tone_proc.process()) fbo_out.bind(); if (bindShader(srTonemapPass, &prog)) { prog->setUniformValue("gamma", gamma_); prog->setUniformValue("frame_max", tone_proc.frameMax()); fbo_out.bindColorTexture(obrSum, 0); fbo_out.setWriteBuffer(obrTonemap); renderQuad(prog, quad); - } else + } else { fbo_out.blit(obrSum, fbo_out.id(), obrTonemap, fbo_out.rect(), fbo_out.rect()); + } //glClearFramebuffer(Qt::red, false); fbo_out.release(); diff --git a/renderer_material.cpp b/renderer_material.cpp index 65cb3b4..d1e70a9 100644 --- a/renderer_material.cpp +++ b/renderer_material.cpp @@ -95,7 +95,7 @@ void RendererMaterial::renderMaterial(Material * m) { mat_l[Light::Omni] << mat_light; r->reloadLightsParameters(mat_l); r->reloadLightsPositions(mat_camera); - glClearFramebuffer(r->view->backColor(), false); + glClearFramebuffer(Qt::black, false); r->renderQuad(prog, r->quad, mat_camera); r->view->scene()->setLightsChanged(); } diff --git a/widgets/scene_tree.cpp b/widgets/scene_tree.cpp index 8ecad49..0448ac7 100644 --- a/widgets/scene_tree.cpp +++ b/widgets/scene_tree.cpp @@ -56,6 +56,8 @@ SceneTree::SceneTree(QWidget * parent): QWidget(parent) { ui->treeObjects->header()->setSectionResizeMode(cVis, QHeaderView::ResizeToContents); ui->treeObjects->header()->setSectionsMovable(false); ui->treeObjects->header()->swapSections(cName, cVis); + ui->treeObjects->setItemDelegateForColumn(1, new NoEditDelegate(this)); + ui->treeObjects->setItemDelegateForColumn(2, new NoEditDelegate(this)); icon_empty = QIcon(":/icons/type-empty.png"); icon_geo = QIcon(":/icons/type-geo.png"); icon_camera = QIcon(":/icons/type-camera.png"); @@ -110,6 +112,11 @@ QList SceneTree::actionsSelection() { } +void SceneTree::expandItems() { + ui->treeObjects->expandAll(); +} + + void SceneTree::changeEvent(QEvent * e) { QWidget::changeEvent(e); if (e->type() == QEvent::LanguageChange) { @@ -265,19 +272,30 @@ bool SceneTree::filterTree(QTreeWidgetItem * ti, const QString & filter, int typ void SceneTree::checkActions() { bool has_1 = false, has_m = false; + bool has_cam = false; + bool has_mesh = false; + bool is_def_cam = false; if (view) { - has_1 = !view->selectedObjects().isEmpty(); - has_m = view->selectedObjects().size() > 1; + is_def_cam = view->isDefaultCamera(); + ObjectBaseList slo = view->selectedObjects(); + has_1 = !slo.isEmpty(); + has_m = slo.size() > 1; + for (ObjectBase * o : slo) { + if (o->type() == ObjectBase::glCamera) has_cam = (slo.size() == 1); + if (o->type() == ObjectBase::glMesh) has_mesh = true; + } } - ui->actionFocus ->setEnabled(has_1); + + ui->actionFocus ->setEnabled(has_mesh); ui->actionRemove->setEnabled(has_1); ui->actionClone ->setEnabled(has_1); ui->actionGroup->setEnabled(has_m); ui->actionTransfer_transform_to_children->setEnabled(has_1); ui->actionSelect_parent->setEnabled(has_1); - ui->actionSelect_by_mesh->setEnabled(has_1); - ui->actionSelect_by_material->setEnabled(has_1); - ui->actionActive_camera->setEnabled(has_1); + ui->actionSelect_by_mesh->setEnabled(has_mesh); + ui->actionSelect_by_material->setEnabled(has_mesh); + ui->actionActive_camera->setEnabled(has_cam); + ui->actionDefault_camera->setEnabled(is_def_cam); } diff --git a/widgets/scene_tree.h b/widgets/scene_tree.h index bf16a55..8be300c 100644 --- a/widgets/scene_tree.h +++ b/widgets/scene_tree.h @@ -39,6 +39,7 @@ public: void assignQGLView(QGLView * v); QList actionsAdd(); QList actionsSelection(); + void expandItems(); private: void changeEvent(QEvent * e); diff --git a/widgets/scene_tree.ui b/widgets/scene_tree.ui index ec57188..e0c943c 100644 --- a/widgets/scene_tree.ui +++ b/widgets/scene_tree.ui @@ -38,7 +38,7 @@ - + :/icons/configure.png:/icons/configure.png @@ -98,6 +98,9 @@ QAbstractItemView::ScrollPerPixel + + 2 + true @@ -124,7 +127,7 @@ - + :/icons/type-camera.png:/icons/type-camera.png @@ -133,7 +136,7 @@ - + :/icons/edit-delete.png:/icons/edit-delete.png @@ -142,7 +145,7 @@ - + :/icons/edit-copy.png:/icons/edit-copy.png @@ -169,7 +172,7 @@ - + :/icons/type-geo.png:/icons/type-geo.png @@ -178,7 +181,7 @@ - + :/icons/format-fill-color.png:/icons/format-fill-color.png @@ -229,7 +232,7 @@ true - + :/icons/type-geo.png:/icons/type-geo.png @@ -241,7 +244,7 @@ true - + :/icons/type-light.png:/icons/type-light.png @@ -253,7 +256,7 @@ true - + :/icons/type-camera.png:/icons/type-camera.png @@ -267,7 +270,7 @@ - + :/icons/type-camera.png:/icons/type-camera.png @@ -276,7 +279,7 @@ - + :/icons/type-camera.png:/icons/type-camera.png @@ -297,11 +300,16 @@ - - - + + + + + + + + diff --git a/widgets/treewidget_p.h b/widgets/treewidget_p.h index 18cce4b..9e0f0eb 100644 --- a/widgets/treewidget_p.h +++ b/widgets/treewidget_p.h @@ -23,6 +23,7 @@ #include #include #include +#include class InternalMoveTreeWidget: public QTreeWidget { @@ -48,4 +49,13 @@ signals: }; + +class NoEditDelegate: public QStyledItemDelegate { +public: + NoEditDelegate(QObject* parent=0): QStyledItemDelegate(parent) {} + virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { + return nullptr; + } +}; + #endif // TREEWIDGET_H diff --git a/widgets/view_editor.cpp b/widgets/view_editor.cpp index b0bdeff..9928072 100644 --- a/widgets/view_editor.cpp +++ b/widgets/view_editor.cpp @@ -26,7 +26,7 @@ ViewEditor::ViewEditor(QWidget * parent): QWidget(parent) { ui = new Ui::ViewEditor(); ui->setupUi(this); - view = 0; + view = nullptr; active = true; ui->checkCameraLight->setCheckState(Qt::PartiallyChecked); #if QT_VERSION >= QT_VERSION_CHECK(5,12,0) @@ -54,7 +54,9 @@ void ViewEditor::assignQGLView(QGLView * v) { ui->lineHDR->setProperty("GLpath", view->environmentMapFile()); ui->lineHDR->setText(QFileInfo(view->environmentMapFile()).fileName()); ui->checkVSync->setChecked(view->getVSync()); - ui->spinSamples->setValue(view->getSamples()); + ui->colorFogBack->setColor(view->fogColor()); + ui->spinFogDecay->setValue(view->fogDecay()); + ui->spinFogDensity->setValue(view->fogDensity()); active = true; } @@ -181,12 +183,26 @@ void ViewEditor::on_buttonHDRSelect_clicked() { } +void ViewEditor::on_colorFogBack_colorChanged(const QColor & color) { + if (!view || !active) return; + view->setFogColor(color); +} + + +void ViewEditor::on_spinFogDensity_valueChanged(double arg1) { + if (!view || !active) return; + view->setFogDensity(arg1); +} + + +void ViewEditor::on_spinFogDecay_valueChanged(double arg1) { + if (!view || !active) return; + view->setFogDecay(arg1); +} + + void ViewEditor::on_checkVSync_clicked(bool val) { + if (!view || !active) return; view->setVSync(val); } - -void ViewEditor::on_spinSamples_valueChanged(int arg1) { - view->setSamples(arg1); -} - diff --git a/widgets/view_editor.h b/widgets/view_editor.h index 0e91c2d..03cc744 100644 --- a/widgets/view_editor.h +++ b/widgets/view_editor.h @@ -58,9 +58,11 @@ private slots: void on_checkService_clicked(bool val); void on_checkCameraLight_stateChanged(int s); void on_checkVSync_clicked(bool val); - void on_spinSamples_valueChanged(int arg1); void on_buttonHDRClear_clicked(); void on_buttonHDRSelect_clicked(); + void on_colorFogBack_colorChanged(const QColor &color); + void on_spinFogDensity_valueChanged(double arg1); + void on_spinFogDecay_valueChanged(double arg1); }; #endif // VIEW_EDITOR_H diff --git a/widgets/view_editor.ui b/widgets/view_editor.ui index 3097383..df6e181 100644 --- a/widgets/view_editor.ui +++ b/widgets/view_editor.ui @@ -29,9 +29,6 @@ QFormLayout::AllNonFixedFieldsGrow - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - 0 @@ -78,9 +75,6 @@ Gamma: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -181,22 +175,6 @@ - - - - Samples: - - - -1 - - - 16 - - - -1 - - - @@ -238,9 +216,6 @@ FOV: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -265,9 +240,6 @@ Depth start: - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - @@ -415,17 +387,14 @@ QFormLayout::AllNonFixedFieldsGrow - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + Density: - + @@ -449,27 +418,16 @@ - - - - - 128 - 128 - 128 - - - - - + Decay: - + 0.000000000000000 @@ -497,6 +455,24 @@ + + + + + 128 + 128 + 128 + + + + + + + + Color + + + @@ -531,7 +507,6 @@ -