Volumetric rendering Example▲
Sélectionnez
/**
**************************************************************************
**
** 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-&
gt;hasContext()) {
QMessageBox msgBox;
msgBox.setText("Couldn't initialize the OpenGL context."
);
msgBox.exec();
return
-
1
;
}
QSize screenSize =
graph-&
gt;screen()-&
gt;size();
container-&
gt;setMinimumSize(QSize(screenSize.width() /
3
, screenSize.height() /
3
));
container-&
gt;setMaximumSize(screenSize);
container-&
gt;setSizePolicy(QSizePolicy::
Expanding, QSizePolicy::
Expanding);
container-&
gt;setFocusPolicy(Qt::
StrongFocus);
QWidget *
widget =
new
QWidget();
QHBoxLayout *
hLayout =
new
QHBoxLayout(widget);
QVBoxLayout *
vLayout =
new
QVBoxLayout();
QVBoxLayout *
vLayout2 =
new
QVBoxLayout();
hLayout-&
gt;addWidget(container, 1
);
hLayout-&
gt;addLayout(vLayout);
hLayout-&
gt;addLayout(vLayout2);
widget-&
gt;setWindowTitle(QStringLiteral("Volumetric object example - 3D terrain"
));
QCheckBox *
sliceXCheckBox =
new
QCheckBox(widget);
sliceXCheckBox-&
gt;setText(QStringLiteral("Slice volume on X axis"
));
sliceXCheckBox-&
gt;setChecked(false
);
QCheckBox *
sliceYCheckBox =
new
QCheckBox(widget);
sliceYCheckBox-&
gt;setText(QStringLiteral("Slice volume on Y axis"
));
sliceYCheckBox-&
gt;setChecked(false
);
QCheckBox *
sliceZCheckBox =
new
QCheckBox(widget);
sliceZCheckBox-&
gt;setText(QStringLiteral("Slice volume on Z axis"
));
sliceZCheckBox-&
gt;setChecked(false
);
QSlider *
sliceXSlider =
new
QSlider(Qt::
Horizontal, widget);
sliceXSlider-&
gt;setMinimum(0
);
sliceXSlider-&
gt;setMaximum(1024
);
sliceXSlider-&
gt;setValue(512
);
sliceXSlider-&
gt;setEnabled(true
);
QSlider *
sliceYSlider =
new
QSlider(Qt::
Horizontal, widget);
sliceYSlider-&
gt;setMinimum(0
);
sliceYSlider-&
gt;setMaximum(1024
);
sliceYSlider-&
gt;setValue(512
);
sliceYSlider-&
gt;setEnabled(true
);
QSlider *
sliceZSlider =
new
QSlider(Qt::
Horizontal, widget);
sliceZSlider-&
gt;setMinimum(0
);
sliceZSlider-&
gt;setMaximum(1024
);
sliceZSlider-&
gt;setValue(512
);
sliceZSlider-&
gt;setEnabled(true
);
QCheckBox *
fpsCheckBox =
new
QCheckBox(widget);
fpsCheckBox-&
gt;setText(QStringLiteral("Show FPS"
));
fpsCheckBox-&
gt;setChecked(false
);
QLabel *
fpsLabel =
new
QLabel(QStringLiteral(""
), widget);
QGroupBox *
textureDetailGroupBox =
new
QGroupBox(QStringLiteral("Texture detail"
));
QRadioButton *
lowDetailRB =
new
QRadioButton(widget);
lowDetailRB-&
gt;setText(QStringLiteral("Low (128x64x128)"
));
lowDetailRB-&
gt;setChecked(true
);
QRadioButton *
mediumDetailRB =
new
QRadioButton(widget);
mediumDetailRB-&
gt;setText(QStringLiteral("Generating..."
));
mediumDetailRB-&
gt;setChecked(false
);
mediumDetailRB-&
gt;setEnabled(false
);
QRadioButton *
highDetailRB =
new
QRadioButton(widget);
highDetailRB-&
gt;setText(QStringLiteral("Generating..."
));
highDetailRB-&
gt;setChecked(false
);
highDetailRB-&
gt;setEnabled(false
);
QVBoxLayout *
textureDetailVBox =
new
QVBoxLayout;
textureDetailVBox-&
gt;addWidget(lowDetailRB);
textureDetailVBox-&
gt;addWidget(mediumDetailRB);
textureDetailVBox-&
gt;addWidget(highDetailRB);
textureDetailGroupBox-&
gt;setLayout(textureDetailVBox);
QGroupBox *
areaGroupBox =
new
QGroupBox(QStringLiteral("Show area"
));
QRadioButton *
areaAllRB =
new
QRadioButton(widget);
areaAllRB-&
gt;setText(QStringLiteral("Whole region"
));
areaAllRB-&
gt;setChecked(true
);
QRadioButton *
areaMineRB =
new
QRadioButton(widget);
areaMineRB-&
gt;setText(QStringLiteral("The mine"
));
areaMineRB-&
gt;setChecked(false
);
QRadioButton *
areaMountainRB =
new
QRadioButton(widget);
areaMountainRB-&
gt;setText(QStringLiteral("The mountain"
));
areaMountainRB-&
gt;setChecked(false
);
QVBoxLayout *
areaVBox =
new
QVBoxLayout;
areaVBox-&
gt;addWidget(areaAllRB);
areaVBox-&
gt;addWidget(areaMineRB);
areaVBox-&
gt;addWidget(areaMountainRB);
areaGroupBox-&
gt;setLayout(areaVBox);
QCheckBox *
colorTableCheckBox =
new
QCheckBox(widget);
colorTableCheckBox-&
gt;setText(QStringLiteral("Alternate color table"
));
colorTableCheckBox-&
gt;setChecked(false
);
QLabel *
sliceImageXLabel =
new
QLabel(widget);
QLabel *
sliceImageYLabel =
new
QLabel(widget);
QLabel *
sliceImageZLabel =
new
QLabel(widget);
sliceImageXLabel-&
gt;setMinimumSize(QSize(200
, 100
));
sliceImageYLabel-&
gt;setMinimumSize(QSize(200
, 200
));
sliceImageZLabel-&
gt;setMinimumSize(QSize(200
, 100
));
sliceImageXLabel-&
gt;setMaximumSize(QSize(200
, 100
));
sliceImageYLabel-&
gt;setMaximumSize(QSize(200
, 200
));
sliceImageZLabel-&
gt;setMaximumSize(QSize(200
, 100
));
sliceImageXLabel-&
gt;setFrameShape(QFrame::
Box);
sliceImageYLabel-&
gt;setFrameShape(QFrame::
Box);
sliceImageZLabel-&
gt;setFrameShape(QFrame::
Box);
sliceImageXLabel-&
gt;setScaledContents(true
);
sliceImageYLabel-&
gt;setScaledContents(true
);
sliceImageZLabel-&
gt;setScaledContents(true
);
QSlider *
alphaMultiplierSlider =
new
QSlider(Qt::
Horizontal, widget);
alphaMultiplierSlider-&
gt;setMinimum(0
);
alphaMultiplierSlider-&
gt;setMaximum(139
);
alphaMultiplierSlider-&
gt;setValue(100
);
alphaMultiplierSlider-&
gt;setEnabled(true
);
QLabel *
alphaMultiplierLabel =
new
QLabel(QStringLiteral("Alpha multiplier: 1.0"
));
QCheckBox *
preserveOpacityCheckBox =
new
QCheckBox(widget);
preserveOpacityCheckBox-&
gt;setText(QStringLiteral("Preserve opacity"
));
preserveOpacityCheckBox-&
gt;setChecked(true
);
QCheckBox *
transparentGroundCheckBox =
new
QCheckBox(widget);
transparentGroundCheckBox-&
gt;setText(QStringLiteral("Transparent ground"
));
transparentGroundCheckBox-&
gt;setChecked(false
);
QCheckBox *
useHighDefShaderCheckBox =
new
QCheckBox(widget);
useHighDefShaderCheckBox-&
gt;setText(QStringLiteral("Use HD shader"
));
useHighDefShaderCheckBox-&
gt;setChecked(true
);
QLabel *
performanceNoteLabel =
new
QLabel(QStringLiteral(
"Note: A high end graphics card is
\n
recommended with the HD shader
\n
when the volume contains a lot of
\n
transparent areas."
));
performanceNoteLabel-&
gt;setFrameShape(QFrame::
Box);
QCheckBox *
drawSliceFramesCheckBox =
new
QCheckBox(widget);
drawSliceFramesCheckBox-&
gt;setText(QStringLiteral("Draw slice frames"
));
drawSliceFramesCheckBox-&
gt;setChecked(false
);
vLayout-&
gt;addWidget(sliceXCheckBox);
vLayout-&
gt;addWidget(sliceXSlider);
vLayout-&
gt;addWidget(sliceImageXLabel);
vLayout-&
gt;addWidget(sliceYCheckBox);
vLayout-&
gt;addWidget(sliceYSlider);
vLayout-&
gt;addWidget(sliceImageYLabel);
vLayout-&
gt;addWidget(sliceZCheckBox);
vLayout-&
gt;addWidget(sliceZSlider);
vLayout-&
gt;addWidget(sliceImageZLabel);
vLayout-&
gt;addWidget(drawSliceFramesCheckBox, 1
, Qt::
AlignTop);
vLayout2-&
gt;addWidget(fpsCheckBox);
vLayout2-&
gt;addWidget(fpsLabel);
vLayout2-&
gt;addWidget(textureDetailGroupBox);
vLayout2-&
gt;addWidget(areaGroupBox);
vLayout2-&
gt;addWidget(colorTableCheckBox);
vLayout2-&
gt;addWidget(alphaMultiplierLabel);
vLayout2-&
gt;addWidget(alphaMultiplierSlider);
vLayout2-&
gt;addWidget(preserveOpacityCheckBox);
vLayout2-&
gt;addWidget(transparentGroundCheckBox);
vLayout2-&
gt;addWidget(useHighDefShaderCheckBox);
vLayout2-&
gt;addWidget(performanceNoteLabel, 1
, Qt::
AlignTop);
VolumetricModifier *
modifier =
new
VolumetricModifier(graph);
modifier-&
gt;setFpsLabel(fpsLabel);
modifier-&
gt;setMediumDetailRB(mediumDetailRB);
modifier-&
gt;setHighDetailRB(highDetailRB);
modifier-&
gt;setSliceSliders(sliceXSlider, sliceYSlider, sliceZSlider);
modifier-&
gt;setSliceLabels(sliceImageXLabel, sliceImageYLabel, sliceImageZLabel);
modifier-&
gt;setAlphaMultiplierLabel(alphaMultiplierLabel);
modifier-&
gt;setTransparentGround(transparentGroundCheckBox-&
gt;isChecked());
QObject::
connect(fpsCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
setFpsMeasurement);
QObject::
connect(sliceXCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
sliceX);
QObject::
connect(sliceYCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
sliceY);
QObject::
connect(sliceZCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
sliceZ);
QObject::
connect(sliceXSlider, &
amp;QSlider::
valueChanged, modifier,
&
amp;VolumetricModifier::
adjustSliceX);
QObject::
connect(sliceYSlider, &
amp;QSlider::
valueChanged, modifier,
&
amp;VolumetricModifier::
adjustSliceY);
QObject::
connect(sliceZSlider, &
amp;QSlider::
valueChanged, modifier,
&
amp;VolumetricModifier::
adjustSliceZ);
QObject::
connect(lowDetailRB, &
amp;QRadioButton::
toggled, modifier,
&
amp;VolumetricModifier::
toggleLowDetail);
QObject::
connect(mediumDetailRB, &
amp;QRadioButton::
toggled, modifier,
&
amp;VolumetricModifier::
toggleMediumDetail);
QObject::
connect(highDetailRB, &
amp;QRadioButton::
toggled, modifier,
&
amp;VolumetricModifier::
toggleHighDetail);
QObject::
connect(colorTableCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
changeColorTable);
QObject::
connect(preserveOpacityCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
setPreserveOpacity);
QObject::
connect(transparentGroundCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
setTransparentGround);
QObject::
connect(useHighDefShaderCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
setUseHighDefShader);
QObject::
connect(alphaMultiplierSlider, &
amp;QSlider::
valueChanged, modifier,
&
amp;VolumetricModifier::
adjustAlphaMultiplier);
QObject::
connect(areaAllRB, &
amp;QRadioButton::
toggled, modifier,
&
amp;VolumetricModifier::
toggleAreaAll);
QObject::
connect(areaMineRB, &
amp;QRadioButton::
toggled, modifier,
&
amp;VolumetricModifier::
toggleAreaMine);
QObject::
connect(areaMountainRB, &
amp;QRadioButton::
toggled, modifier,
&
amp;VolumetricModifier::
toggleAreaMountain);
QObject::
connect(drawSliceFramesCheckBox, &
amp;QCheckBox::
stateChanged, modifier,
&
amp;VolumetricModifier::
setDrawSliceFrames);
widget-&
gt;show();
return
app.exec();
}