main.cpp Example File | Qt Data Visualization 5.9

Qt 5.9 | Qt Data Visualization | Volumetric rendering Example | main.cpp Example File

Qt 5.9.4 Reference Documentation

# main.cpp Example File

volumetric/main.cpp

      /****************************************************************************
      **
      ** Copyright (C) 2016 The Qt Company Ltd.
      ** Contact: https://www.qt.io/licensing/
      **
      ** This file is part of the Qt Data Visualization module of the Qt Toolkit.
      **
      ** $QT_BEGIN_LICENSE:GPL$
      ** Commercial License Usage
      ** Licensees holding valid commercial Qt licenses may use this file in
      ** accordance with the commercial license agreement provided with the
      ** Software or, alternatively, in accordance with the terms contained in
      ** a written agreement between you and The Qt Company. For licensing terms
      ** and conditions see https://www.qt.io/terms-conditions. For further
      ** information use the contact form at https://www.qt.io/contact-us.
      **
      ** GNU General Public License Usage
      ** Alternatively, this file may be used under the terms of the GNU
      ** General Public License version 3 or (at your option) any later version
      ** approved by the KDE Free Qt Foundation. The licenses are as published by
      ** the Free Software Foundation and appearing in the file LICENSE.GPL3
      ** included in the packaging of this file. Please review the following
      ** information to ensure the GNU General Public License requirements will
      ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
      **
      ** $QT_END_LICENSE$
      **
      ****************************************************************************/

      #include "volumetric.h"

      #include <QtWidgets/QApplication>
      #include <QtWidgets/QWidget>
      #include <QtWidgets/QHBoxLayout>
      #include <QtWidgets/QVBoxLayout>
      #include <QtWidgets/QRadioButton>
      #include <QtWidgets/QSlider>
      #include <QtWidgets/QCheckBox>
      #include <QtWidgets/QLabel>
      #include <QtWidgets/QGroupBox>
      #include <QtWidgets/QMessageBox>
      #include <QtGui/QScreen>

      int main(int argc, char **argv)
      {
          QApplication app(argc, argv);
          Q3DScatter *graph = new Q3DScatter();
          QWidget *container = QWidget::createWindowContainer(graph);

          if (!graph->hasContext()) {
              QMessageBox msgBox;
              msgBox.setText("Couldn't initialize the OpenGL context.");
              msgBox.exec();
              return -1;
          }

          QSize screenSize = graph->screen()->size();
          container->setMinimumSize(QSize(screenSize.width() / 3, screenSize.height() / 3));
          container->setMaximumSize(screenSize);
          container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
          container->setFocusPolicy(Qt::StrongFocus);

          QWidget *widget = new QWidget();
          QHBoxLayout *hLayout = new QHBoxLayout(widget);
          QVBoxLayout *vLayout = new QVBoxLayout();
          QVBoxLayout *vLayout2 = new QVBoxLayout();
          hLayout->addWidget(container, 1);
          hLayout->addLayout(vLayout);
          hLayout->addLayout(vLayout2);

          widget->setWindowTitle(QStringLiteral("Volumetric object example - 3D terrain"));

          QCheckBox *sliceXCheckBox = new QCheckBox(widget);
          sliceXCheckBox->setText(QStringLiteral("Slice volume on X axis"));
          sliceXCheckBox->setChecked(false);
          QCheckBox *sliceYCheckBox = new QCheckBox(widget);
          sliceYCheckBox->setText(QStringLiteral("Slice volume on Y axis"));
          sliceYCheckBox->setChecked(false);
          QCheckBox *sliceZCheckBox = new QCheckBox(widget);
          sliceZCheckBox->setText(QStringLiteral("Slice volume on Z axis"));
          sliceZCheckBox->setChecked(false);

          QSlider *sliceXSlider = new QSlider(Qt::Horizontal, widget);
          sliceXSlider->setMinimum(0);
          sliceXSlider->setMaximum(1024);
          sliceXSlider->setValue(512);
          sliceXSlider->setEnabled(true);
          QSlider *sliceYSlider = new QSlider(Qt::Horizontal, widget);
          sliceYSlider->setMinimum(0);
          sliceYSlider->setMaximum(1024);
          sliceYSlider->setValue(512);
          sliceYSlider->setEnabled(true);
          QSlider *sliceZSlider = new QSlider(Qt::Horizontal, widget);
          sliceZSlider->setMinimum(0);
          sliceZSlider->setMaximum(1024);
          sliceZSlider->setValue(512);
          sliceZSlider->setEnabled(true);

          QCheckBox *fpsCheckBox = new QCheckBox(widget);
          fpsCheckBox->setText(QStringLiteral("Show FPS"));
          fpsCheckBox->setChecked(false);
          QLabel *fpsLabel = new QLabel(QStringLiteral(""), widget);

          QGroupBox *textureDetailGroupBox = new QGroupBox(QStringLiteral("Texture detail"));

          QRadioButton *lowDetailRB = new QRadioButton(widget);
          lowDetailRB->setText(QStringLiteral("Low (128x64x128)"));
          lowDetailRB->setChecked(true);

          QRadioButton *mediumDetailRB = new QRadioButton(widget);
          mediumDetailRB->setText(QStringLiteral("Generating..."));
          mediumDetailRB->setChecked(false);
          mediumDetailRB->setEnabled(false);

          QRadioButton *highDetailRB = new QRadioButton(widget);
          highDetailRB->setText(QStringLiteral("Generating..."));
          highDetailRB->setChecked(false);
          highDetailRB->setEnabled(false);

          QVBoxLayout *textureDetailVBox = new QVBoxLayout;
          textureDetailVBox->addWidget(lowDetailRB);
          textureDetailVBox->addWidget(mediumDetailRB);
          textureDetailVBox->addWidget(highDetailRB);
          textureDetailGroupBox->setLayout(textureDetailVBox);

          QGroupBox *areaGroupBox = new QGroupBox(QStringLiteral("Show area"));

          QRadioButton *areaAllRB = new QRadioButton(widget);
          areaAllRB->setText(QStringLiteral("Whole region"));
          areaAllRB->setChecked(true);

          QRadioButton *areaMineRB = new QRadioButton(widget);
          areaMineRB->setText(QStringLiteral("The mine"));
          areaMineRB->setChecked(false);

          QRadioButton *areaMountainRB = new QRadioButton(widget);
          areaMountainRB->setText(QStringLiteral("The mountain"));
          areaMountainRB->setChecked(false);

          QVBoxLayout *areaVBox = new QVBoxLayout;
          areaVBox->addWidget(areaAllRB);
          areaVBox->addWidget(areaMineRB);
          areaVBox->addWidget(areaMountainRB);
          areaGroupBox->setLayout(areaVBox);

          QCheckBox *colorTableCheckBox = new QCheckBox(widget);
          colorTableCheckBox->setText(QStringLiteral("Alternate color table"));
          colorTableCheckBox->setChecked(false);

          QLabel *sliceImageXLabel = new QLabel(widget);
          QLabel *sliceImageYLabel = new QLabel(widget);
          QLabel *sliceImageZLabel = new QLabel(widget);
          sliceImageXLabel->setMinimumSize(QSize(200, 100));
          sliceImageYLabel->setMinimumSize(QSize(200, 200));
          sliceImageZLabel->setMinimumSize(QSize(200, 100));
          sliceImageXLabel->setMaximumSize(QSize(200, 100));
          sliceImageYLabel->setMaximumSize(QSize(200, 200));
          sliceImageZLabel->setMaximumSize(QSize(200, 100));
          sliceImageXLabel->setFrameShape(QFrame::Box);
          sliceImageYLabel->setFrameShape(QFrame::Box);
          sliceImageZLabel->setFrameShape(QFrame::Box);
          sliceImageXLabel->setScaledContents(true);
          sliceImageYLabel->setScaledContents(true);
          sliceImageZLabel->setScaledContents(true);

          QSlider *alphaMultiplierSlider = new QSlider(Qt::Horizontal, widget);
          alphaMultiplierSlider->setMinimum(0);
          alphaMultiplierSlider->setMaximum(139);
          alphaMultiplierSlider->setValue(100);
          alphaMultiplierSlider->setEnabled(true);
          QLabel *alphaMultiplierLabel = new QLabel(QStringLiteral("Alpha multiplier: 1.0"));

          QCheckBox *preserveOpacityCheckBox = new QCheckBox(widget);
          preserveOpacityCheckBox->setText(QStringLiteral("Preserve opacity"));
          preserveOpacityCheckBox->setChecked(true);

          QCheckBox *transparentGroundCheckBox = new QCheckBox(widget);
          transparentGroundCheckBox->setText(QStringLiteral("Transparent ground"));
          transparentGroundCheckBox->setChecked(false);

          QCheckBox *useHighDefShaderCheckBox = new QCheckBox(widget);
          useHighDefShaderCheckBox->setText(QStringLiteral("Use HD shader"));
          useHighDefShaderCheckBox->setChecked(true);

          QLabel *performanceNoteLabel =
                  new QLabel(QStringLiteral(
                                 "Note: A high end graphics card is\nrecommended with the HD shader\nwhen the volume contains a lot of\ntransparent areas."));
          performanceNoteLabel->setFrameShape(QFrame::Box);

          QCheckBox *drawSliceFramesCheckBox = new QCheckBox(widget);
          drawSliceFramesCheckBox->setText(QStringLiteral("Draw slice frames"));
          drawSliceFramesCheckBox->setChecked(false);

          vLayout->addWidget(sliceXCheckBox);
          vLayout->addWidget(sliceXSlider);
          vLayout->addWidget(sliceImageXLabel);
          vLayout->addWidget(sliceYCheckBox);
          vLayout->addWidget(sliceYSlider);
          vLayout->addWidget(sliceImageYLabel);
          vLayout->addWidget(sliceZCheckBox);
          vLayout->addWidget(sliceZSlider);
          vLayout->addWidget(sliceImageZLabel);
          vLayout->addWidget(drawSliceFramesCheckBox, 1, Qt::AlignTop);
          vLayout2->addWidget(fpsCheckBox);
          vLayout2->addWidget(fpsLabel);
          vLayout2->addWidget(textureDetailGroupBox);
          vLayout2->addWidget(areaGroupBox);
          vLayout2->addWidget(colorTableCheckBox);
          vLayout2->addWidget(alphaMultiplierLabel);
          vLayout2->addWidget(alphaMultiplierSlider);
          vLayout2->addWidget(preserveOpacityCheckBox);
          vLayout2->addWidget(transparentGroundCheckBox);
          vLayout2->addWidget(useHighDefShaderCheckBox);
          vLayout2->addWidget(performanceNoteLabel, 1, Qt::AlignTop);

          VolumetricModifier *modifier = new VolumetricModifier(graph);
          modifier->setFpsLabel(fpsLabel);
          modifier->setMediumDetailRB(mediumDetailRB);
          modifier->setHighDetailRB(highDetailRB);
          modifier->setSliceSliders(sliceXSlider, sliceYSlider, sliceZSlider);
          modifier->setSliceLabels(sliceImageXLabel, sliceImageYLabel, sliceImageZLabel);
          modifier->setAlphaMultiplierLabel(alphaMultiplierLabel);
          modifier->setTransparentGround(transparentGroundCheckBox->isChecked());

          QObject::connect(fpsCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::setFpsMeasurement);
          QObject::connect(sliceXCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::sliceX);
          QObject::connect(sliceYCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::sliceY);
          QObject::connect(sliceZCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::sliceZ);
          QObject::connect(sliceXSlider, &QSlider::valueChanged, modifier,
                           &VolumetricModifier::adjustSliceX);
          QObject::connect(sliceYSlider, &QSlider::valueChanged, modifier,
                           &VolumetricModifier::adjustSliceY);
          QObject::connect(sliceZSlider, &QSlider::valueChanged, modifier,
                           &VolumetricModifier::adjustSliceZ);
          QObject::connect(lowDetailRB, &QRadioButton::toggled, modifier,
                           &VolumetricModifier::toggleLowDetail);
          QObject::connect(mediumDetailRB, &QRadioButton::toggled, modifier,
                           &VolumetricModifier::toggleMediumDetail);
          QObject::connect(highDetailRB, &QRadioButton::toggled, modifier,
                           &VolumetricModifier::toggleHighDetail);
          QObject::connect(colorTableCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::changeColorTable);
          QObject::connect(preserveOpacityCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::setPreserveOpacity);
          QObject::connect(transparentGroundCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::setTransparentGround);
          QObject::connect(useHighDefShaderCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::setUseHighDefShader);
          QObject::connect(alphaMultiplierSlider, &QSlider::valueChanged, modifier,
                           &VolumetricModifier::adjustAlphaMultiplier);
          QObject::connect(areaAllRB, &QRadioButton::toggled, modifier,
                           &VolumetricModifier::toggleAreaAll);
          QObject::connect(areaMineRB, &QRadioButton::toggled, modifier,
                           &VolumetricModifier::toggleAreaMine);
          QObject::connect(areaMountainRB, &QRadioButton::toggled, modifier,
                           &VolumetricModifier::toggleAreaMountain);
          QObject::connect(drawSliceFramesCheckBox, &QCheckBox::stateChanged, modifier,
                           &VolumetricModifier::setDrawSliceFrames);

          widget->show();
          return app.exec();
      }