Skip to content

Commit c80ddb0

Browse files
committed
Merge branch 'release/2.3.0'
2 parents 2b5fcef + 5dd0a17 commit c80ddb0

26 files changed

+377
-107
lines changed

CHANGELOG.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,23 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## 2.3.0 - 2019-07-13
9+
10+
### Added
11+
- Added menu bar with option to save simulation result as image
12+
- Added slider for setting the probability of double scattering
13+
14+
### Changed
15+
- Replaced Add Population and Remove Population texts with icons
16+
817
## 2.2.0 - 2019-07-09
918

1019
### Added
1120
- Created an application icon for HaloRay
1221
- Added possibility to add preset crystal populations
1322

1423
### Changed
15-
- Disabled "Add population" button when there is only one population in simulation
24+
- Disabled "Remove population" button when there is only one population in simulation
1625
- Added multiple crystal populations by default
1726

1827
## 2.1.1 - 2019-07-08

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# HaloRay
1+
# HaloRay ![](images/hexagon_small.png)
22
[![Build status](https://ci.appveyor.com/api/projects/status/5k9laekby84x2ex1/branch/develop?svg=true)](https://ci.appveyor.com/project/naavis/haloray/branch/develop)
33

44
HaloRay simulates the reflection and refraction of sun light inside hexagonal
@@ -37,9 +37,14 @@ Here are some general settings for the whole simulation.
3737
- **Rays per frame:** Number of rays traced through individual crystals per
3838
rendered frame
3939
- If the user interface slows down a lot during rendering, lower this value
40-
- On an NVIDIA GeForce GTX 1070 a good value seems to be 500 000 - 1 000 000
40+
- On an NVIDIA GeForce GTX 1070 a good value seems to be around 500 000
4141
- The maximum value for this parameter may be limited by your GPU
4242
- **Maximum frames:** Simulation stops after rendering this many frames
43+
- **Double scattering:** Probability of a single light ray to scatter from two
44+
different ice crystals
45+
- Note that this slows down the simulation significantly!
46+
- A value of 0.0 means no rays are scattered twice, and 1.0 means all rays
47+
are scattered twice
4348

4449
### Crystal settings
4550

@@ -139,6 +144,7 @@ resulting executable:
139144
- Qt5Core.dll
140145
- Qt5Widgets.dll
141146
- Qt5Gui.dll
147+
- Qt5Svg.dll
142148

143149
You can also do this automatically with the
144150
[windeployqt](https://doc.qt.io/qt-5/windows-deployment.html) tool, which is

appveyor.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
version: '2.2.0-{build}'
1+
version: '2.3.0-{build}'
22
branches:
33
only:
44
- master
55
- develop
6-
- /release\/.+/
76
image: Visual Studio 2017
87
clone_depth: 1
98
environment:

images/hexagon_small.png

1.02 KB
Loading

src/gui/addCrystalPopulationButton.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
AddCrystalPopulationButton::AddCrystalPopulationButton(QWidget *parent)
44
: QToolButton(parent)
55
{
6-
setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding);
7-
86
mMenu = new QMenu(this);
97

10-
mAddRandom = new QAction("Add random", this);
11-
mAddPlate = new QAction("Add plate", this);
12-
mAddColumn = new QAction("Add column", this);
13-
mAddParry = new QAction("Add Parry", this);
14-
mAddLowitz = new QAction("Add Lowitz", this);
8+
mAddRandom = new QAction(tr("Add random"), this);
9+
mAddPlate = new QAction(tr("Add plate"), this);
10+
mAddColumn = new QAction(tr("Add column"), this);
11+
mAddParry = new QAction(tr("Add Parry"), this);
12+
mAddLowitz = new QAction(tr("Add Lowitz"), this);
1513

1614
mMenu->addActions({mAddRandom,
1715
mAddPlate,
@@ -20,7 +18,8 @@ AddCrystalPopulationButton::AddCrystalPopulationButton(QWidget *parent)
2018
mAddLowitz});
2119

2220
setPopupMode(QToolButton::ToolButtonPopupMode::MenuButtonPopup);
23-
setText("Add population");
21+
setIcon(QIcon::fromTheme("list-add"));
22+
2423
setMenu(mMenu);
2524

2625
connect(this, &AddCrystalPopulationButton::clicked, [this]() { emit addPopulation(HaloSim::CrystalPopulationPreset::Random); });

src/gui/crystalSettingsWidget.cpp

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "../simulation/crystalPopulation.h"
55

66
CrystalSettingsWidget::CrystalSettingsWidget(std::shared_ptr<HaloSim::CrystalPopulationRepository> crystalRepository, QWidget *parent)
7-
: QGroupBox("Crystal settings", parent),
7+
: QGroupBox("Crystal population settings", parent),
88
mModel(new CrystalModel(crystalRepository)),
99
mNextPopulationId(1)
1010
{
@@ -66,7 +66,7 @@ CrystalSettingsWidget::CrystalSettingsWidget(std::shared_ptr<HaloSim::CrystalPop
6666
updateRemovePopulationButtonState();
6767
});
6868

69-
connect(mRemovePopulationButton, &QPushButton::clicked, [this]() {
69+
connect(mRemovePopulationButton, &QToolButton::clicked, [this]() {
7070
int index = mMapper->currentIndex();
7171
if (index == 0)
7272
mMapper->toNext();
@@ -112,73 +112,66 @@ void CrystalSettingsWidget::setupUi()
112112
mPopulationComboBox->setDuplicatesEnabled(true);
113113

114114
mAddPopulationButton = new AddCrystalPopulationButton();
115-
mAddPopulationButton->setMinimumHeight(30);
115+
mAddPopulationButton->setIconSize(QSize(24, 24));
116116

117-
mRemovePopulationButton = new QPushButton("Remove population");
118-
mRemovePopulationButton->setMinimumHeight(30);
119-
mRemovePopulationButton->setStyleSheet("padding: 10px;");
117+
mRemovePopulationButton = new QToolButton();
118+
mRemovePopulationButton->setIcon(QIcon::fromTheme("list-remove"));
119+
mRemovePopulationButton->setIconSize(QSize(24, 24));
120120

121121
mCaRatioSlider = new SliderSpinBox(0.0, 15.0);
122122

123123
mCaRatioStdSlider = new SliderSpinBox(0.0, 10.0);
124124

125125
mTiltDistributionComboBox = new QComboBox();
126-
mTiltDistributionComboBox->addItems({"Uniform", "Gaussian"});
126+
mTiltDistributionComboBox->addItems({tr("Uniform"), tr("Gaussian")});
127127

128-
mTiltAverageLabel = new QLabel("Average");
129-
mTiltAverageSlider = createAngleSlider(0.0, 180.0);
128+
mTiltAverageLabel = new QLabel(tr("Average"));
129+
mTiltAverageSlider = SliderSpinBox::createAngleSlider(0.0, 180.0);
130130

131-
mTiltStdLabel = new QLabel("Standard deviation");
132-
mTiltStdSlider = createAngleSlider(0.0, 360.0);
131+
mTiltStdLabel = new QLabel(tr("Standard deviation"));
132+
mTiltStdSlider = SliderSpinBox::createAngleSlider(0.0, 360.0);
133133

134134
mRotationDistributionComboBox = new QComboBox();
135-
mRotationDistributionComboBox->addItems({"Uniform", "Gaussian"});
135+
mRotationDistributionComboBox->addItems({tr("Uniform"), tr("Gaussian")});
136136

137-
mRotationAverageLabel = new QLabel("Average");
138-
mRotationAverageSlider = createAngleSlider(0.0, 180.0);
137+
mRotationAverageLabel = new QLabel(tr("Average"));
138+
mRotationAverageSlider = SliderSpinBox::createAngleSlider(0.0, 180.0);
139139

140-
mRotationStdLabel = new QLabel("Standard deviation");
141-
mRotationStdSlider = createAngleSlider(0.0, 360.0);
140+
mRotationStdLabel = new QLabel(tr("Standard deviation"));
141+
mRotationStdSlider = SliderSpinBox::createAngleSlider(0.0, 360.0);
142142

143143
mWeightSpinBox = new QSpinBox();
144144
mWeightSpinBox->setMinimum(0);
145145
mWeightSpinBox->setMaximum(10000);
146146

147147
auto mainLayout = new QFormLayout(this);
148-
mainLayout->addRow("Crystal population", mPopulationComboBox);
149148

150149
auto populationButtonLayout = new QHBoxLayout();
150+
populationButtonLayout->addWidget(mPopulationComboBox);
151151
populationButtonLayout->addWidget(mAddPopulationButton);
152152
populationButtonLayout->addWidget(mRemovePopulationButton);
153153

154154
mainLayout->addRow(populationButtonLayout);
155-
mainLayout->addRow("Population weight", mWeightSpinBox);
155+
mainLayout->addRow(tr("Population weight"), mWeightSpinBox);
156156
mainLayout->addItem(new QSpacerItem(0, 10));
157-
mainLayout->addRow("C/A ratio average", mCaRatioSlider);
158-
mainLayout->addRow("C/A ratio std.", mCaRatioStdSlider);
157+
mainLayout->addRow(tr("C/A ratio average"), mCaRatioSlider);
158+
mainLayout->addRow(tr("C/A ratio std."), mCaRatioStdSlider);
159159

160-
auto tiltGroupBox = new QGroupBox("C-axis tilt");
160+
auto tiltGroupBox = new QGroupBox(tr("C-axis tilt"));
161161
auto tiltLayout = new QFormLayout(tiltGroupBox);
162162
mainLayout->addRow(tiltGroupBox);
163-
tiltLayout->addRow("Distribution", mTiltDistributionComboBox);
163+
tiltLayout->addRow(tr("Distribution"), mTiltDistributionComboBox);
164164
tiltLayout->addRow(mTiltAverageLabel, mTiltAverageSlider);
165165
tiltLayout->addRow(mTiltStdLabel, mTiltStdSlider);
166166

167-
auto rotationGroupBox = new QGroupBox("Rotation around C-axis");
167+
auto rotationGroupBox = new QGroupBox(tr("Rotation around C-axis"));
168168
auto rotationLayout = new QFormLayout(rotationGroupBox);
169169
mainLayout->addRow(rotationGroupBox);
170-
rotationLayout->addRow("Distribution", mRotationDistributionComboBox);
170+
rotationLayout->addRow(tr("Distribution"), mRotationDistributionComboBox);
171171
rotationLayout->addRow(mRotationAverageLabel, mRotationAverageSlider);
172172
rotationLayout->addRow(mRotationStdLabel, mRotationStdSlider);
173173
}
174174

175-
SliderSpinBox *CrystalSettingsWidget::createAngleSlider(double min, double max)
176-
{
177-
auto slider = new SliderSpinBox(min, max);
178-
slider->setSuffix("°");
179-
return slider;
180-
}
181-
182175
void CrystalSettingsWidget::setTiltVisibility(bool visible)
183176
{
184177
mTiltAverageSlider->setVisible(visible);

src/gui/crystalSettingsWidget.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <QGroupBox>
44
#include <QComboBox>
55
#include <QLabel>
6-
#include <QPushButton>
6+
#include <QToolButton>
77
#include <QSpinBox>
88
#include <QDataWidgetMapper>
99
#include "addCrystalPopulationButton.h"
@@ -31,7 +31,7 @@ class CrystalSettingsWidget : public QGroupBox
3131
void setRotationVisibility(bool);
3232

3333
AddCrystalPopulationButton *mAddPopulationButton;
34-
QPushButton *mRemovePopulationButton;
34+
QToolButton *mRemovePopulationButton;
3535

3636
SliderSpinBox *mCaRatioSlider;
3737
SliderSpinBox *mCaRatioStdSlider;

src/gui/generalSettingsWidget.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,43 @@ GeneralSettingsWidget::GeneralSettingsWidget(QWidget *parent)
77
setupUi();
88

99
connect(mSunAltitudeSlider, &SliderSpinBox::valueChanged, [this]() {
10-
lightSourceChanged(stateToLightSource());
10+
emit lightSourceChanged(stateToLightSource());
1111
});
1212

1313
connect(mSunDiameterSpinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged), [this]() {
14-
lightSourceChanged(stateToLightSource());
14+
emit lightSourceChanged(stateToLightSource());
1515
});
1616

1717
connect(mRaysPerFrameSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [this](int value) {
18-
numRaysChanged((unsigned int)value);
18+
emit numRaysChanged((unsigned int)value);
1919
});
2020

2121
connect(mMaximumFramesSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), [this](int value) {
22-
maximumNumberOfIterationsChanged((unsigned int)value);
22+
emit maximumNumberOfIterationsChanged((unsigned int)value);
2323
});
24+
25+
connect(mMultipleScattering, &SliderSpinBox::valueChanged, this, &GeneralSettingsWidget::multipleScatteringProbabilityChanged);
2426
}
2527

2628
void GeneralSettingsWidget::setInitialValues(double sunDiameter,
2729
double sunAltitude,
2830
unsigned int raysPerFrame,
29-
unsigned int maxNumFrames)
31+
unsigned int maxNumFrames,
32+
double multipleScatteringProbability)
3033
{
3134
mSunDiameterSpinBox->setValue(sunDiameter);
3235
mSunAltitudeSlider->setValue(sunAltitude);
3336
mRaysPerFrameSpinBox->setValue(raysPerFrame);
3437
mMaximumFramesSpinBox->setValue(maxNumFrames);
38+
mMultipleScattering->setValue(multipleScatteringProbability);
3539
}
3640

3741
void GeneralSettingsWidget::setupUi()
3842
{
3943
setMaximumWidth(400);
4044

4145
mSunAltitudeSlider = new SliderSpinBox();
42-
mSunAltitudeSlider->setSuffix("­°");
43-
mSunAltitudeSlider->setMinimum(-90.0);
44-
mSunAltitudeSlider->setMaximum(90.0);
45-
mSunAltitudeSlider->setValue(0.0);
46+
mSunAltitudeSlider = SliderSpinBox::createAngleSlider(-90.0, 90.0);
4647

4748
mSunDiameterSpinBox = new QDoubleSpinBox();
4849
mSunDiameterSpinBox->setSuffix("­°");
@@ -65,11 +66,16 @@ void GeneralSettingsWidget::setupUi()
6566
mMaximumFramesSpinBox->setValue(100000000);
6667
mMaximumFramesSpinBox->setGroupSeparatorShown(true);
6768

69+
mMultipleScattering = new SliderSpinBox();
70+
mMultipleScattering->setMinimum(0.0);
71+
mMultipleScattering->setMaximum(1.0);
72+
6873
auto layout = new QFormLayout(this);
69-
layout->addRow("Sun altitude", mSunAltitudeSlider);
70-
layout->addRow("Sun diameter", mSunDiameterSpinBox);
71-
layout->addRow("Rays per frame", mRaysPerFrameSpinBox);
72-
layout->addRow("Maximum frames", mMaximumFramesSpinBox);
74+
layout->addRow(tr("Sun altitude"), mSunAltitudeSlider);
75+
layout->addRow(tr("Sun diameter"), mSunDiameterSpinBox);
76+
layout->addRow(tr("Rays per frame"), mRaysPerFrameSpinBox);
77+
layout->addRow(tr("Maximum frames"), mMaximumFramesSpinBox);
78+
layout->addRow(tr("Double scattering"), mMultipleScattering);
7379
}
7480

7581
HaloSim::LightSource GeneralSettingsWidget::stateToLightSource() const

src/gui/generalSettingsWidget.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ class GeneralSettingsWidget : public QGroupBox
1414
void setInitialValues(double sunDiameter,
1515
double sunAltitude,
1616
unsigned int raysPerFrame,
17-
unsigned int maxNumFrames);
17+
unsigned int maxNumFrames,
18+
double multipleScatteringProbability);
1819

1920
signals:
2021
void lightSourceChanged(HaloSim::LightSource light);
2122
void numRaysChanged(unsigned int rays);
2223
void maximumNumberOfIterationsChanged(unsigned int iterations);
24+
void multipleScatteringProbabilityChanged(double probability);
2325

2426
public slots:
2527
void toggleMaxIterationsSpinBoxStatus();
@@ -33,4 +35,5 @@ public slots:
3335
QDoubleSpinBox *mSunDiameterSpinBox;
3436
QSpinBox *mRaysPerFrameSpinBox;
3537
QSpinBox *mMaximumFramesSpinBox;
38+
SliderSpinBox *mMultipleScattering;
3639
};

0 commit comments

Comments
 (0)