Volumetric rendering Example

 /****************************************************************************
 **
 ** 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();
 }