blob: 751886a87d15303ee112360bc65b2f109802254f [file] [log] [blame]
/****************************************************************************
**
** 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();
}