diff --git a/Builds/MSVC/Installer/FractoriumInstaller.wixproj b/Builds/MSVC/Installer/FractoriumInstaller.wixproj
index 1179170..6d98384 100644
--- a/Builds/MSVC/Installer/FractoriumInstaller.wixproj
+++ b/Builds/MSVC/Installer/FractoriumInstaller.wixproj
@@ -6,7 +6,7 @@
3.7
{c8096c47-e358-438c-a520-146d46b0637d}
2.0
- Fractorium_1.0.0.3
+ Fractorium_1.0.0.4
Package
$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets
$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets
diff --git a/Builds/MSVC/Installer/Product.wxs b/Builds/MSVC/Installer/Product.wxs
index b297c0c..862d105 100644
--- a/Builds/MSVC/Installer/Product.wxs
+++ b/Builds/MSVC/Installer/Product.wxs
@@ -13,7 +13,7 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -167,74 +167,87 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
+
+
-
+
+
-
+
@@ -242,7 +255,7 @@
-
+
diff --git a/Data/dark_linux.qss b/Data/dark_linux.qss
new file mode 100644
index 0000000..56dd6f0
--- /dev/null
+++ b/Data/dark_linux.qss
@@ -0,0 +1,632 @@
+/*---Base Style---
+ This is needed to deal with the large tabs in the fusion theme which is the default on Linux, and optional on Windows.
+ It's not needed for other themes.
+ You should keep this at the top of whatever custom style you make to ensure the tabs aren't unusually large.*/
+QTabBar::tab { height: 3ex; }
+
+/*This is needed to give the labels on the status bar some padding.*/
+QStatusBar QLabel { padding-left: 2px; padding-right: 2px; }
+
+/*Specific styles below this line*/
+
+QObject
+{
+ background-color : rgb(53, 53, 53);
+ color: darkgray;
+ alternate-background-color: rgb(53, 53, 53);
+ selection-color: black;
+ selection-background-color: rgb(42, 130, 218);
+}
+
+QObject:disabled
+{
+ color: rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border-color: rgb(35, 35, 35);
+}
+
+QDockWidget::float-button
+{
+ background-color: gray;
+}
+
+QDockWidget::title
+{
+ margin: 1px;
+ padding: 2px;
+ background-color: gray;
+}
+
+QTabWidget::pane
+{
+ border: 1px solid gray;
+}
+
+QPushButton
+{
+ margin: 1px;
+ padding: 4px;
+ border: 1px solid gray;
+}
+
+QPushButton:pressed
+{
+ background-color: gray;
+}
+
+QPushButton:focus
+{
+ outline: none;
+}
+
+QTableView QPushButton
+{
+ border: 1px solid gray;
+ margin: 1px;
+ padding: 0px;
+}
+
+QLineEdit, QTextEdit
+{
+ border: 1px solid gray;
+ color: darkgray;
+ background-color: rgb(40, 40, 50);
+ selection-background-color: darkgray;
+}
+
+QToolTip
+{
+ background-color: darkgray;
+ border: 1px solid darkgray;
+}
+
+QSpinBox,
+QDoubleSpinBox
+{
+ padding-right: 0px;
+ color: darkgray;
+ selection-background-color: darkgray;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QCheckBox
+{
+ spacing: 5px;
+ outline: 0px;
+}
+
+QCheckBox::indicator,
+QTableView::indicator
+{
+ border: none;
+ border-radius: 2px;
+ background-color: lightgray;
+}
+
+QCheckBox::indicator:enabled:unchecked,
+QTableView::indicator:enabled:unchecked
+{
+ background-color: lightgray;
+ image: url(:/Fractorium/Icons/checkbox_unchecked.png);
+}
+
+QCheckBox::indicator:enabled:checked,
+QTableView::indicator:enabled:checked
+{
+ background-color: lightgray;
+ image: url(:/Fractorium/Icons/checkbox_checked.png);
+}
+
+QCheckBox::indicator:disabled:unchecked,
+QTableView::indicator:disabled:unchecked
+{
+ background-color: gray;
+ image: none;
+}
+
+QCheckBox::indicator:disabled:checked,
+QTableView::indicator:disabled:checked
+{
+ background-color: gray;
+ image: none;
+}
+
+QRadioButton::indicator:checked
+{
+ background-color: black;
+ border: 2px solid gray;
+ border-radius: 7px;
+ width: 8px;
+ height: 8px;
+ margin: 3px;
+ padding: 1px;
+}
+
+QRadioButton::indicator:checked:disabled
+{
+ background-color: rgb(35, 35, 35);
+}
+
+QRadioButton::indicator:unchecked
+{
+ border: 2px solid gray;
+ border-radius: 7px;
+ width: 8px;
+ height: 8px;
+ margin: 3px;
+ padding: 1px;
+}
+
+QComboBox
+{
+ margin: 0px;
+ padding-left: 4px;
+ border: 1px solid gray;
+}
+
+QComboBox::down-arrow:enabled
+{
+ border: 1px solid gray;
+ margin-right: 2px;
+ margin-top: 0px;
+ margin-bottom: 1px;
+}
+
+
+QComboBox::down-arrow:disabled
+{
+ border: 1px solid rgb(35, 35, 35);
+ margin-right: 2px;
+ margin-top: 0px;
+ margin-bottom: 1px;
+}
+
+QComboBox::drop-down
+{
+ border: none;
+}
+
+/*For some reason this is needed with Fusion, but not with Windows*/
+QComboBox::item:selected
+{
+ selection-background-color: darkgray;
+}
+
+QComboBox QAbstractItemView
+{
+ border: 1px solid gray;
+ outline: none;
+ selection-background-color: darkgray;
+}
+
+QTableView QComboBox
+{
+ margin: 1px;
+ padding: 0px;
+ padding-left: 3px;
+}
+
+QGroupBox QComboBox
+{
+ margin: 1px;
+ margin-bottom: 0px;
+}
+
+QTableView QComboBox::down-arrow
+{
+ margin-top: 0px;
+ margin-right: 1px;
+ margin-bottom: 0px;
+}
+
+QProgressBar
+{
+ color: black;
+ background-color: gray;
+ border: 0px none gray;
+ border-radius: 3px;
+ text-align: center;
+}
+
+QProgressBar::chunk
+{
+ border-radius: 3px;
+ background-color: lightgray;
+}
+
+QStatusBar QProgressBar
+{
+ min-width: 300px;
+ max-width: 300px;
+ margin-right: 4px;
+}
+
+QMenuBar
+{
+ border-bottom: 1px solid gray;
+}
+
+QMenuBar::item
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QMenu::item:disabled
+{
+ color: rgb(35, 35, 35);
+
+}
+
+QMenu::item:enabled:selected
+{
+ background-color: gray;
+}
+
+QMenu::item:disabled:selected
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QToolBar
+{
+ border: 0px none gray;
+}
+
+QGroupBox
+{
+ padding-top: 3px;
+ border: 2px solid gray;
+ border-radius: 4px;
+ margin-top: 3ex;
+}
+
+QGroupBox::title
+{
+ subcontrol-origin: border;
+ subcontrol-position: top left;
+ margin-top: -1ex;
+ margin-left: 0px;
+ padding-right: 1px;
+ padding-left: 2px;
+ top: -2ex;
+ left: 8px;
+}
+
+QListView
+{
+ selection-color: black;
+ selection-background-color: darkgray;
+}
+
+QListView::item:selected
+{
+ background-color: darkgray;
+}
+
+QTreeView
+{
+ border: 1px solid gray;
+ background-color: rgb(53, 53, 53);
+ font: 9pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+/*Setting this gives a more consistent look, but removes the ability to gray variations that are included in the xform*/
+QTreeView::item
+{
+ background-color: rgb(53, 53, 53);
+ color: darkgray;
+ outline: none;
+ margin-right: 1px;
+}
+
+QTreeView::item:hover
+{
+ border: 0px none black;
+ background-color: gray;
+ outline: none;
+}
+
+QTreeView::item:selected
+{
+ border: 0px none black;
+ background-color: gray;
+ outline: none;
+}
+
+QTreeView::branch:!has-children
+{
+ background: rgb(53, 53, 53);
+}
+
+QTreeView::branch:has-children:closed
+{
+ border: 1px solid darkgray;
+ background: gray;
+ margin: 2px;
+}
+
+QTreeView::branch:has-children:!closed
+{
+ border: 1px solid lightgray;
+ background: gray;
+ margin-left: 1px;
+ margin-right: 0px;
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+QTableView
+{
+ border-left: 0px none gray;
+ border-top: 0px none gray;
+ border-right: 0px none gray;
+ border-bottom: 0px none gray;
+ gridline-color: gray;
+ color: darkgray;
+ selection-color: darkgray;
+ selection-background-color: rgb(53, 53, 53);
+ font: 9pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QTableView QTableCornerButton::section:enabled
+{
+ background-color: darkgray;
+}
+
+QTableView QTableCornerButton::section:disabled
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QTableView::indicator:disabled
+{
+ background-color: rgb(35, 35, 35);
+}
+
+QTableView:disabled
+{
+ color: rgb(35, 35, 35);
+ border: none;
+ gridline-color: rgb(35, 35, 35);
+}
+
+QHeaderView::section::vertical:enabled
+{
+ color: black;
+ background-color: gray;
+ border: none;
+ border-bottom: 1px solid gray;
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::horizontal:enabled
+{
+ color: black;
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ border-right: 1px solid gray;
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::vertical:disabled
+{
+ color: rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border: 0px none darkgray;
+ border-bottom: 1px solid rgb(53, 53, 53);
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::horizontal:disabled
+{
+ color:rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border: 0px none darkgray;
+ border-right: 1px solid rgb(53, 53, 53);
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QScrollBar::vertical
+{
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ width: 15px;
+ margin: 22px 0 22px 0;
+}
+
+QScrollBar::handle::vertical
+{
+ background-color: gray;
+ border-top: 1px solid darkgray;
+ border-bottom: 1px solid darkgray;
+ min-height: 20px;
+}
+
+QScrollBar::add-line::vertical
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ height: 22px;
+ subcontrol-position: bottom;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line::vertical
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ height: 22px;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::up-arrow::vertical, QScrollBar::down-arrow::vertical
+{
+ border: 2px solid darkgray;
+ width: 5px;
+ height: 12px;
+ background-color: gray;
+}
+
+QScrollBar::add-page::vertical, QScrollBar::sub-page::vertical, QScrollBar::add-page::horizontal, QScrollBar::sub-page::horizontal
+{
+ background-color: darkgray;
+}
+
+QScrollBar::horizontal
+{
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ height: 15px;
+ margin: 0px 20px 0 20px;
+}
+
+QScrollBar::handle::horizontal
+{
+ background-color: gray;
+ border-left: 1px solid darkgray;
+ border-right: 1px solid darkgray;
+ min-width: 20px;
+}
+
+QScrollBar::add-line::horizontal
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ width: 20px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line::horizontal
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ width: 20px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::left-arrow::horizontal, QScrollBar::right-arrow::horizontal
+{
+ border: 2px solid darkgray;
+ width: 12px;
+ height: 5px;
+ background-color: gray;
+}
+
+QMenu::separator
+{
+ height: 1px;
+ background-color: gray;
+}
+
+QToolBar::separator
+{
+ width: 1px;
+ margin-top: 3px;
+ margin-bottom: 2px;
+ background-color: gray;
+}
+
+QStatusBar::item
+{
+ border: none;
+}
+
+/*Specific controls*/
+QTableWidget#ColorTableHeader QHeaderView::section::horizontal,
+QTableWidget#GeometryTableHeader QHeaderView::section::horizontal,
+QTableWidget#FilterTableHeader QHeaderView::section::horizontal,
+QTableWidget#IterationTableHeader QHeaderView::section::horizontal,
+QTableWidget#AnimationTableHeader QHeaderView::section::horizontal,
+QTreeWidget#LibraryTree QHeaderView::section::horizontal
+{
+ border-right: none;
+}
+
+QTableWidget#ColorTable,
+QTableWidget#GeometryTable,
+QTableWidget#FilterTable,
+QTableWidget#IterationTable,
+QTableWidget#AnimationTable,
+QTableWidget#XformWeightNameTable
+{
+ border-left: 1px solid gray;
+}
+
+QTableWidget#SummaryTable
+{
+ border-left: 1px solid gray;
+}
+
+/*Normally doesn't matter, but when a palette file doesn't have enough palettes in it to fill the whole table, it looks funny without a border*/
+QTableWidget#PaletteListTable
+{
+ border: 1px solid gray;
+}
+
+QTableWidget#SummaryTable QHeaderView::section::vertical
+{
+ background-color: darkgray;
+}
+
+QTableWidget#PaletteAdjustTable,
+QTableWidget#PalettePreviewTable,
+QTableWidget#XformColorIndexTable,
+QTableWidget#XformColorValuesTable,
+QTableWidget#InfoBoundsTable,
+QTableWidget#OptionsXmlSavingTable,
+QTableWidget#OptionsIdentityTable,
+QTableWidget#FinalRenderSizeTable,
+QTableWidget#FinalRenderParamsTable
+{
+ border-left: 1px solid gray;
+ border-top: 1px solid gray;
+}
+
+QLineEdit#PaletteFilterLineEdit,
+QLineEdit#VariationsFilterLineEdit
+{
+ height: 20px;
+ min-height: 20px;
+ max-height: 20px;
+}
+
+QSpinBox#ThreadCountSpin,
+QSpinBox#RandomCountSpin,
+QSpinBox#CpuSubBatchSpin,
+QSpinBox#OpenCLSubBatchSpin,
+QSpinBox#FinalRenderCurrentSpin,
+QSpinBox#FinalRenderThreadCountSpin
+{
+ padding: 2px;
+ border: 1px solid gray;
+}
+
+QSpinBox#ThreadCountSpin:disabled,
+QSpinBox#CpuSubBatchSpin:disabled,
+QSpinBox#OpenCLSubBatchSpin:disabled,
+QSpinBox#FinalRenderCurrentSpin:disabled,
+QSpinBox#FinalRenderThreadCountSpin:disabled
+{
+ padding: 2px;
+ border: 1px solid rgb(35, 35, 35);
+}
+
+QTableView#FinalRenderParamsTable QComboBox
+{
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+QTableView#FinalRenderParamsTable QPushButton
+{
+ margin-top: 1px;
+ margin-bottom: 2px;
+ padding: 0px;
+}
diff --git a/Data/dark_mac.qss b/Data/dark_mac.qss
new file mode 100644
index 0000000..56dd6f0
--- /dev/null
+++ b/Data/dark_mac.qss
@@ -0,0 +1,632 @@
+/*---Base Style---
+ This is needed to deal with the large tabs in the fusion theme which is the default on Linux, and optional on Windows.
+ It's not needed for other themes.
+ You should keep this at the top of whatever custom style you make to ensure the tabs aren't unusually large.*/
+QTabBar::tab { height: 3ex; }
+
+/*This is needed to give the labels on the status bar some padding.*/
+QStatusBar QLabel { padding-left: 2px; padding-right: 2px; }
+
+/*Specific styles below this line*/
+
+QObject
+{
+ background-color : rgb(53, 53, 53);
+ color: darkgray;
+ alternate-background-color: rgb(53, 53, 53);
+ selection-color: black;
+ selection-background-color: rgb(42, 130, 218);
+}
+
+QObject:disabled
+{
+ color: rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border-color: rgb(35, 35, 35);
+}
+
+QDockWidget::float-button
+{
+ background-color: gray;
+}
+
+QDockWidget::title
+{
+ margin: 1px;
+ padding: 2px;
+ background-color: gray;
+}
+
+QTabWidget::pane
+{
+ border: 1px solid gray;
+}
+
+QPushButton
+{
+ margin: 1px;
+ padding: 4px;
+ border: 1px solid gray;
+}
+
+QPushButton:pressed
+{
+ background-color: gray;
+}
+
+QPushButton:focus
+{
+ outline: none;
+}
+
+QTableView QPushButton
+{
+ border: 1px solid gray;
+ margin: 1px;
+ padding: 0px;
+}
+
+QLineEdit, QTextEdit
+{
+ border: 1px solid gray;
+ color: darkgray;
+ background-color: rgb(40, 40, 50);
+ selection-background-color: darkgray;
+}
+
+QToolTip
+{
+ background-color: darkgray;
+ border: 1px solid darkgray;
+}
+
+QSpinBox,
+QDoubleSpinBox
+{
+ padding-right: 0px;
+ color: darkgray;
+ selection-background-color: darkgray;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QCheckBox
+{
+ spacing: 5px;
+ outline: 0px;
+}
+
+QCheckBox::indicator,
+QTableView::indicator
+{
+ border: none;
+ border-radius: 2px;
+ background-color: lightgray;
+}
+
+QCheckBox::indicator:enabled:unchecked,
+QTableView::indicator:enabled:unchecked
+{
+ background-color: lightgray;
+ image: url(:/Fractorium/Icons/checkbox_unchecked.png);
+}
+
+QCheckBox::indicator:enabled:checked,
+QTableView::indicator:enabled:checked
+{
+ background-color: lightgray;
+ image: url(:/Fractorium/Icons/checkbox_checked.png);
+}
+
+QCheckBox::indicator:disabled:unchecked,
+QTableView::indicator:disabled:unchecked
+{
+ background-color: gray;
+ image: none;
+}
+
+QCheckBox::indicator:disabled:checked,
+QTableView::indicator:disabled:checked
+{
+ background-color: gray;
+ image: none;
+}
+
+QRadioButton::indicator:checked
+{
+ background-color: black;
+ border: 2px solid gray;
+ border-radius: 7px;
+ width: 8px;
+ height: 8px;
+ margin: 3px;
+ padding: 1px;
+}
+
+QRadioButton::indicator:checked:disabled
+{
+ background-color: rgb(35, 35, 35);
+}
+
+QRadioButton::indicator:unchecked
+{
+ border: 2px solid gray;
+ border-radius: 7px;
+ width: 8px;
+ height: 8px;
+ margin: 3px;
+ padding: 1px;
+}
+
+QComboBox
+{
+ margin: 0px;
+ padding-left: 4px;
+ border: 1px solid gray;
+}
+
+QComboBox::down-arrow:enabled
+{
+ border: 1px solid gray;
+ margin-right: 2px;
+ margin-top: 0px;
+ margin-bottom: 1px;
+}
+
+
+QComboBox::down-arrow:disabled
+{
+ border: 1px solid rgb(35, 35, 35);
+ margin-right: 2px;
+ margin-top: 0px;
+ margin-bottom: 1px;
+}
+
+QComboBox::drop-down
+{
+ border: none;
+}
+
+/*For some reason this is needed with Fusion, but not with Windows*/
+QComboBox::item:selected
+{
+ selection-background-color: darkgray;
+}
+
+QComboBox QAbstractItemView
+{
+ border: 1px solid gray;
+ outline: none;
+ selection-background-color: darkgray;
+}
+
+QTableView QComboBox
+{
+ margin: 1px;
+ padding: 0px;
+ padding-left: 3px;
+}
+
+QGroupBox QComboBox
+{
+ margin: 1px;
+ margin-bottom: 0px;
+}
+
+QTableView QComboBox::down-arrow
+{
+ margin-top: 0px;
+ margin-right: 1px;
+ margin-bottom: 0px;
+}
+
+QProgressBar
+{
+ color: black;
+ background-color: gray;
+ border: 0px none gray;
+ border-radius: 3px;
+ text-align: center;
+}
+
+QProgressBar::chunk
+{
+ border-radius: 3px;
+ background-color: lightgray;
+}
+
+QStatusBar QProgressBar
+{
+ min-width: 300px;
+ max-width: 300px;
+ margin-right: 4px;
+}
+
+QMenuBar
+{
+ border-bottom: 1px solid gray;
+}
+
+QMenuBar::item
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QMenu::item:disabled
+{
+ color: rgb(35, 35, 35);
+
+}
+
+QMenu::item:enabled:selected
+{
+ background-color: gray;
+}
+
+QMenu::item:disabled:selected
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QToolBar
+{
+ border: 0px none gray;
+}
+
+QGroupBox
+{
+ padding-top: 3px;
+ border: 2px solid gray;
+ border-radius: 4px;
+ margin-top: 3ex;
+}
+
+QGroupBox::title
+{
+ subcontrol-origin: border;
+ subcontrol-position: top left;
+ margin-top: -1ex;
+ margin-left: 0px;
+ padding-right: 1px;
+ padding-left: 2px;
+ top: -2ex;
+ left: 8px;
+}
+
+QListView
+{
+ selection-color: black;
+ selection-background-color: darkgray;
+}
+
+QListView::item:selected
+{
+ background-color: darkgray;
+}
+
+QTreeView
+{
+ border: 1px solid gray;
+ background-color: rgb(53, 53, 53);
+ font: 9pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+/*Setting this gives a more consistent look, but removes the ability to gray variations that are included in the xform*/
+QTreeView::item
+{
+ background-color: rgb(53, 53, 53);
+ color: darkgray;
+ outline: none;
+ margin-right: 1px;
+}
+
+QTreeView::item:hover
+{
+ border: 0px none black;
+ background-color: gray;
+ outline: none;
+}
+
+QTreeView::item:selected
+{
+ border: 0px none black;
+ background-color: gray;
+ outline: none;
+}
+
+QTreeView::branch:!has-children
+{
+ background: rgb(53, 53, 53);
+}
+
+QTreeView::branch:has-children:closed
+{
+ border: 1px solid darkgray;
+ background: gray;
+ margin: 2px;
+}
+
+QTreeView::branch:has-children:!closed
+{
+ border: 1px solid lightgray;
+ background: gray;
+ margin-left: 1px;
+ margin-right: 0px;
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+QTableView
+{
+ border-left: 0px none gray;
+ border-top: 0px none gray;
+ border-right: 0px none gray;
+ border-bottom: 0px none gray;
+ gridline-color: gray;
+ color: darkgray;
+ selection-color: darkgray;
+ selection-background-color: rgb(53, 53, 53);
+ font: 9pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QTableView QTableCornerButton::section:enabled
+{
+ background-color: darkgray;
+}
+
+QTableView QTableCornerButton::section:disabled
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QTableView::indicator:disabled
+{
+ background-color: rgb(35, 35, 35);
+}
+
+QTableView:disabled
+{
+ color: rgb(35, 35, 35);
+ border: none;
+ gridline-color: rgb(35, 35, 35);
+}
+
+QHeaderView::section::vertical:enabled
+{
+ color: black;
+ background-color: gray;
+ border: none;
+ border-bottom: 1px solid gray;
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::horizontal:enabled
+{
+ color: black;
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ border-right: 1px solid gray;
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::vertical:disabled
+{
+ color: rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border: 0px none darkgray;
+ border-bottom: 1px solid rgb(53, 53, 53);
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::horizontal:disabled
+{
+ color:rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border: 0px none darkgray;
+ border-right: 1px solid rgb(53, 53, 53);
+ padding: 4px;
+ font: 9pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QScrollBar::vertical
+{
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ width: 15px;
+ margin: 22px 0 22px 0;
+}
+
+QScrollBar::handle::vertical
+{
+ background-color: gray;
+ border-top: 1px solid darkgray;
+ border-bottom: 1px solid darkgray;
+ min-height: 20px;
+}
+
+QScrollBar::add-line::vertical
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ height: 22px;
+ subcontrol-position: bottom;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line::vertical
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ height: 22px;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::up-arrow::vertical, QScrollBar::down-arrow::vertical
+{
+ border: 2px solid darkgray;
+ width: 5px;
+ height: 12px;
+ background-color: gray;
+}
+
+QScrollBar::add-page::vertical, QScrollBar::sub-page::vertical, QScrollBar::add-page::horizontal, QScrollBar::sub-page::horizontal
+{
+ background-color: darkgray;
+}
+
+QScrollBar::horizontal
+{
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ height: 15px;
+ margin: 0px 20px 0 20px;
+}
+
+QScrollBar::handle::horizontal
+{
+ background-color: gray;
+ border-left: 1px solid darkgray;
+ border-right: 1px solid darkgray;
+ min-width: 20px;
+}
+
+QScrollBar::add-line::horizontal
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ width: 20px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line::horizontal
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ width: 20px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::left-arrow::horizontal, QScrollBar::right-arrow::horizontal
+{
+ border: 2px solid darkgray;
+ width: 12px;
+ height: 5px;
+ background-color: gray;
+}
+
+QMenu::separator
+{
+ height: 1px;
+ background-color: gray;
+}
+
+QToolBar::separator
+{
+ width: 1px;
+ margin-top: 3px;
+ margin-bottom: 2px;
+ background-color: gray;
+}
+
+QStatusBar::item
+{
+ border: none;
+}
+
+/*Specific controls*/
+QTableWidget#ColorTableHeader QHeaderView::section::horizontal,
+QTableWidget#GeometryTableHeader QHeaderView::section::horizontal,
+QTableWidget#FilterTableHeader QHeaderView::section::horizontal,
+QTableWidget#IterationTableHeader QHeaderView::section::horizontal,
+QTableWidget#AnimationTableHeader QHeaderView::section::horizontal,
+QTreeWidget#LibraryTree QHeaderView::section::horizontal
+{
+ border-right: none;
+}
+
+QTableWidget#ColorTable,
+QTableWidget#GeometryTable,
+QTableWidget#FilterTable,
+QTableWidget#IterationTable,
+QTableWidget#AnimationTable,
+QTableWidget#XformWeightNameTable
+{
+ border-left: 1px solid gray;
+}
+
+QTableWidget#SummaryTable
+{
+ border-left: 1px solid gray;
+}
+
+/*Normally doesn't matter, but when a palette file doesn't have enough palettes in it to fill the whole table, it looks funny without a border*/
+QTableWidget#PaletteListTable
+{
+ border: 1px solid gray;
+}
+
+QTableWidget#SummaryTable QHeaderView::section::vertical
+{
+ background-color: darkgray;
+}
+
+QTableWidget#PaletteAdjustTable,
+QTableWidget#PalettePreviewTable,
+QTableWidget#XformColorIndexTable,
+QTableWidget#XformColorValuesTable,
+QTableWidget#InfoBoundsTable,
+QTableWidget#OptionsXmlSavingTable,
+QTableWidget#OptionsIdentityTable,
+QTableWidget#FinalRenderSizeTable,
+QTableWidget#FinalRenderParamsTable
+{
+ border-left: 1px solid gray;
+ border-top: 1px solid gray;
+}
+
+QLineEdit#PaletteFilterLineEdit,
+QLineEdit#VariationsFilterLineEdit
+{
+ height: 20px;
+ min-height: 20px;
+ max-height: 20px;
+}
+
+QSpinBox#ThreadCountSpin,
+QSpinBox#RandomCountSpin,
+QSpinBox#CpuSubBatchSpin,
+QSpinBox#OpenCLSubBatchSpin,
+QSpinBox#FinalRenderCurrentSpin,
+QSpinBox#FinalRenderThreadCountSpin
+{
+ padding: 2px;
+ border: 1px solid gray;
+}
+
+QSpinBox#ThreadCountSpin:disabled,
+QSpinBox#CpuSubBatchSpin:disabled,
+QSpinBox#OpenCLSubBatchSpin:disabled,
+QSpinBox#FinalRenderCurrentSpin:disabled,
+QSpinBox#FinalRenderThreadCountSpin:disabled
+{
+ padding: 2px;
+ border: 1px solid rgb(35, 35, 35);
+}
+
+QTableView#FinalRenderParamsTable QComboBox
+{
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+QTableView#FinalRenderParamsTable QPushButton
+{
+ margin-top: 1px;
+ margin-bottom: 2px;
+ padding: 0px;
+}
diff --git a/Data/dark.qss b/Data/dark_windows.qss
similarity index 93%
rename from Data/dark.qss
rename to Data/dark_windows.qss
index 8142bd1..e3ae66d 100644
--- a/Data/dark.qss
+++ b/Data/dark_windows.qss
@@ -1,629 +1,632 @@
-/*---Base Style---
- This is needed to deal with the large tabs in the fusion theme which is the default on Linux, and optional on Windows.
- It's not needed for other themes.
- You should keep this at the top of whatever custom style you make to ensure the tabs aren't unusually large.*/
-QTabBar::tab { height: 5ex; }/*Do this for windows*/
-/*QTabBar::tab { height: 3ex; }*//*Do this for linux*/
-
-/*This is needed to give the labels on the status bar some padding.*/
-QStatusBar QLabel { padding-left: 2px; padding-right: 2px; }
-
-/*Specific styles below this line*/
-
-QObject
-{
- background-color : rgb(53, 53, 53);
- color: darkgray;
- alternate-background-color: rgb(53, 53, 53);
- selection-color: black;
- selection-background-color: rgb(42, 130, 218);
-}
-
-QObject:disabled
-{
- color: rgb(35, 35, 35);
- background-color: rgb(53, 53, 53);
- border-color: rgb(35, 35, 35);
-}
-
-QDockWidget::float-button
-{
- background-color: gray;
-}
-
-QDockWidget::title
-{
- margin: 1px;
- padding: 2px;
- background-color: gray;
-}
-
-QTabWidget::pane
-{
- border: 1px solid gray;
-}
-
-QPushButton
-{
- margin: 1px;
- padding: 4px;
- border: 1px solid gray;
-}
-
-QPushButton:pressed
-{
- background-color: gray;
-}
-
-QPushButton:focus
-{
- outline: none;
-}
-
-QTableView QPushButton
-{
- border: 1px solid gray;
- margin: 1px;
- padding: 0px;
-}
-
-QLineEdit, QTextEdit
-{
- border: 1px solid gray;
- color: darkgray;
- background-color: rgb(40, 40, 50);
- selection-background-color: darkgray;
-}
-
-QToolTip
-{
- background-color: darkgray;
- border: 1px solid darkgray;
-}
-
-QSpinBox,
-QDoubleSpinBox
-{
- padding-right: 0px;
- color: darkgray;
- selection-background-color: darkgray;
- font: 8pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
-}
-
-QCheckBox
-{
- spacing: 5px;
- outline: 0px;
-}
-
-QCheckBox::indicator,
-QTableView::indicator
-{
- border: none;
- border-radius: 2px;
- background-color: lightgray;
-}
-
-QCheckBox::indicator:enabled:unchecked,
-QTableView::indicator:enabled:unchecked
-{
- background-color: lightgray;
- image: url(:/Fractorium/Icons/checkbox_unchecked.png);
-}
-
-QCheckBox::indicator:enabled:checked,
-QTableView::indicator:enabled:checked
-{
- background-color: lightgray;
- image: url(:/Fractorium/Icons/checkbox_checked.png);
-}
-
-QCheckBox::indicator:disabled:unchecked,
-QTableView::indicator:disabled:unchecked
-{
- background-color: gray;
- image: none;
-}
-
-QCheckBox::indicator:disabled:checked,
-QTableView::indicator:disabled:checked
-{
- background-color: gray;
- image: none;
-}
-
-QRadioButton::indicator:checked
-{
- background-color: black;
- border: 2px solid gray;
- border-radius: 7px;
- width: 8px;
- height: 8px;
- margin: 3px;
- padding: 1px;
-}
-
-QRadioButton::indicator:checked:disabled
-{
- background-color: rgb(35, 35, 35);
-}
-
-QRadioButton::indicator:unchecked
-{
- border: 2px solid gray;
- border-radius: 7px;
- width: 8px;
- height: 8px;
- margin: 3px;
- padding: 1px;
-}
-
-QComboBox
-{
- margin: 0px;
- padding-left: 4px;
- border: 1px solid gray;
-}
-
-QComboBox::down-arrow:enabled
-{
- border: 1px solid gray;
- margin-right: 2px;
- margin-top: 0px;
- margin-bottom: 1px;
-}
-
-
-QComboBox::down-arrow:disabled
-{
- border: 1px solid rgb(35, 35, 35);
- margin-right: 2px;
- margin-top: 0px;
- margin-bottom: 1px;
-}
-
-QComboBox::drop-down
-{
- border: none;
-}
-
-/*For some reason this is needed with Fusion, but not with Windows*/
-QComboBox::item:selected
-{
- selection-background-color: darkgray;
-}
-
-QComboBox QAbstractItemView
-{
- border: 1px solid gray;
- outline: none;
- selection-background-color: darkgray;
-}
-
-QTableView QComboBox
-{
- margin: 1px;
- padding: 0px;
- padding-left: 3px;
-}
-
-QGroupBox QComboBox
-{
- margin: 1px;
- margin-bottom: 0px;
-}
-
-QTableView QComboBox::down-arrow
-{
- margin-top: 0px;
- margin-right: 1px;
- margin-bottom: 0px;
-}
-
-QProgressBar
-{
- color: black;
- background-color: gray;
- border: 0px none gray;
- border-radius: 3px;
- text-align: center;
-}
-
-QProgressBar::chunk
-{
- border-radius: 3px;
- background-color: lightgray;
-}
-
-QStatusBar QProgressBar
-{
- min-width: 300px;
- max-width: 300px;
- margin-right: 4px;
-}
-
-QMenuBar
-{
- border-bottom: 1px solid gray;
-}
-
-QMenuBar::item
-{
- background-color: rgb(53, 53, 53);
-}
-
-QMenu::item:disabled
-{
- color: rgb(35, 35, 35);
-
-}
-
-QMenu::item:enabled:selected
-{
- background-color: gray;
-}
-
-QMenu::item:disabled:selected
-{
- background-color: rgb(53, 53, 53);
-}
-
-QToolBar
-{
- border: 0px none gray;
-}
-
-QGroupBox
-{
- padding-top: 3px;
- border: 2px solid gray;
- border-radius: 4px;
- margin-top: 3ex;
-}
-
-QGroupBox::title
-{
- subcontrol-origin: border;
- subcontrol-position: top left;
- margin-top: -1ex;
- margin-left: 0px;
- padding-right: 1px;
- padding-left: 2px;
- top: -2ex;
- left: 8px;
-}
-
-QListView
-{
- selection-color: black;
- selection-background-color: darkgray;
-}
-
-QListView::item:selected
-{
- background-color: darkgray;
-}
-
-QTreeView
-{
- border: 1px solid gray;
- background-color: rgb(53, 53, 53);
- font: 8pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
-}
-
-/*Setting this gives a more consistent look, but removes the ability to gray variations that are included in the xform*/
-QTreeView::item
-{
- background-color: rgb(53, 53, 53);
- color: darkgray;
- outline: none;
- margin-right: 1px;
-}
-
-QTreeView::item:hover
-{
- border: 0px none black;
- background-color: gray;
- outline: none;
-}
-
-QTreeView::item:selected
-{
- border: 0px none black;
- background-color: gray;
- outline: none;
-}
-
-QTreeView::branch:!has-children
-{
- background: rgb(53, 53, 53);
-}
-
-QTreeView::branch:has-children:closed
-{
- border: 1px solid darkgray;
- background: gray;
- margin: 2px;
-}
-
-QTreeView::branch:has-children:!closed
-{
- border: 1px solid lightgray;
- background: gray;
- margin-left: 1px;
- margin-right: 0px;
- margin-top: 3px;
- margin-bottom: 3px;
-}
-
-QTableView
-{
- border-left: 0px none gray;
- border-top: 0px none gray;
- border-right: 0px none gray;
- border-bottom: 0px none gray;
- gridline-color: gray;
- color: darkgray;
- selection-color: darkgray;
- selection-background-color: rgb(53, 53, 53);
- font: 8pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
-}
-
-QTableView QTableCornerButton::section:enabled
-{
- background-color: darkgray;
-}
-
-QTableView QTableCornerButton::section:disabled
-{
- background-color: rgb(53, 53, 53);
-}
-
-QTableView::indicator:disabled
-{
- background-color: rgb(35, 35, 35);
-}
-
-QTableView:disabled
-{
- color: rgb(35, 35, 35);
- border: none;
- gridline-color: rgb(35, 35, 35);
-}
-
-QHeaderView::section::vertical:enabled
-{
- color: black;
- background-color: gray;
- border: none;
- border-bottom: 1px solid gray;
- padding: 4px;
-}
-
-QHeaderView::section::horizontal:enabled
-{
- color: black;
- background-color: darkgray;
- border: 0px solid darkgray;
- border-right: 1px solid gray;
- padding: 4px;
-}
-
-QHeaderView::section::vertical:disabled
-{
- color: rgb(35, 35, 35);
- background-color: rgb(53, 53, 53);
- border: 0px none darkgray;
- border-bottom: 1px solid rgb(53, 53, 53);
- padding: 4px;
-}
-
-QHeaderView::section::horizontal:disabled
-{
- color:rgb(35, 35, 35);
- background-color: rgb(53, 53, 53);
- border: 0px none darkgray;
- border-right: 1px solid rgb(53, 53, 53);
- padding: 4px;
-}
-
-QScrollBar::vertical
-{
- background-color: darkgray;
- border: 0px solid darkgray;
- width: 15px;
- margin: 22px 0 22px 0;
-}
-
-QScrollBar::handle::vertical
-{
- background-color: gray;
- border-top: 1px solid darkgray;
- border-bottom: 1px solid darkgray;
- min-height: 20px;
-}
-
-QScrollBar::add-line::vertical
-{
- border: 0px solid darkgray;
- background-color: gray;
- height: 22px;
- subcontrol-position: bottom;
- subcontrol-origin: margin;
-}
-
-QScrollBar::sub-line::vertical
-{
- border: 0px solid darkgray;
- background-color: gray;
- height: 22px;
- subcontrol-position: top;
- subcontrol-origin: margin;
-}
-
-QScrollBar::up-arrow::vertical, QScrollBar::down-arrow::vertical
-{
- border: 2px solid darkgray;
- width: 5px;
- height: 12px;
- background-color: gray;
-}
-
-QScrollBar::add-page::vertical, QScrollBar::sub-page::vertical, QScrollBar::add-page::horizontal, QScrollBar::sub-page::horizontal
-{
- background-color: darkgray;
-}
-
-QScrollBar::horizontal
-{
- background-color: darkgray;
- border: 0px solid darkgray;
- height: 15px;
- margin: 0px 20px 0 20px;
-}
-
-QScrollBar::handle::horizontal
-{
- background-color: gray;
- border-left: 1px solid darkgray;
- border-right: 1px solid darkgray;
- min-width: 20px;
-}
-
-QScrollBar::add-line::horizontal
-{
- border: 0px solid darkgray;
- background-color: gray;
- width: 20px;
- subcontrol-position: right;
- subcontrol-origin: margin;
-}
-
-QScrollBar::sub-line::horizontal
-{
- border: 0px solid darkgray;
- background-color: gray;
- width: 20px;
- subcontrol-position: left;
- subcontrol-origin: margin;
-}
-
-QScrollBar::left-arrow::horizontal, QScrollBar::right-arrow::horizontal
-{
- border: 2px solid darkgray;
- width: 12px;
- height: 5px;
- background-color: gray;
-}
-
-QMenu::separator
-{
- height: 1px;
- background-color: gray;
-}
-
-QToolBar::separator
-{
- width: 1px;
- margin-top: 3px;
- margin-bottom: 2px;
- background-color: gray;
-}
-
-QStatusBar::item
-{
- border: none;
-}
-
-/*Specific controls*/
-QTableWidget#ColorTableHeader QHeaderView::section::horizontal,
-QTableWidget#GeometryTableHeader QHeaderView::section::horizontal,
-QTableWidget#FilterTableHeader QHeaderView::section::horizontal,
-QTableWidget#IterationTableHeader QHeaderView::section::horizontal,
-QTableWidget#AnimationTableHeader QHeaderView::section::horizontal,
-QTreeWidget#LibraryTree QHeaderView::section::horizontal
-{
- border-right: none;
-}
-
-QTableWidget#ColorTable,
-QTableWidget#GeometryTable,
-QTableWidget#FilterTable,
-QTableWidget#IterationTable,
-QTableWidget#AnimationTable,
-QTableWidget#XformWeightNameTable
-{
- border-left: 1px solid gray;
-}
-
-QTableWidget#SummaryTable
-{
- border-left: 1px solid gray;
-}
-
-/*Normally doesn't matter, but when a palette file doesn't have enough palettes in it to fill the whole table, it looks funny without a border*/
-QTableWidget#PaletteListTable
-{
- border: 1px solid gray;
-}
-
-QTableWidget#SummaryTable QHeaderView::section::vertical
-{
- background-color: darkgray;
-}
-
-QTableWidget#PaletteAdjustTable,
-QTableWidget#PalettePreviewTable,
-QTableWidget#XformColorIndexTable,
-QTableWidget#XformColorValuesTable,
-QTableWidget#InfoBoundsTable,
-QTableWidget#OptionsXmlSavingTable,
-QTableWidget#OptionsIdentityTable,
-QTableWidget#FinalRenderSizeTable,
-QTableWidget#FinalRenderParamsTable
-{
- border-left: 1px solid gray;
- border-top: 1px solid gray;
-}
-
-QLineEdit#PaletteFilterLineEdit,
-QLineEdit#VariationsFilterLineEdit
-{
- height: 20px;
- min-height: 20px;
- max-height: 20px;
-}
-
-QSpinBox#ThreadCountSpin,
-QSpinBox#RandomCountSpin,
-QSpinBox#CpuSubBatchSpin,
-QSpinBox#OpenCLSubBatchSpin,
-QSpinBox#FinalRenderCurrentSpin,
-QSpinBox#FinalRenderThreadCountSpin
-{
- padding: 2px;
- border: 1px solid gray;
-}
-
-QSpinBox#ThreadCountSpin:disabled,
-QSpinBox#CpuSubBatchSpin:disabled,
-QSpinBox#OpenCLSubBatchSpin:disabled,
-QSpinBox#FinalRenderCurrentSpin:disabled,
-QSpinBox#FinalRenderThreadCountSpin:disabled
-{
- padding: 2px;
- border: 1px solid rgb(35, 35, 35);
-}
-
-QTableView#FinalRenderParamsTable QComboBox
-{
- margin-top: 0px;
- margin-bottom: 0px;
-}
-
-QTableView#FinalRenderParamsTable QPushButton
-{
- margin-top: 1px;
- margin-bottom: 2px;
- padding: 0px;
-}
+/*---Base Style---
+ This is needed to deal with the large tabs in the fusion theme which is the default on Linux, and optional on Windows.
+ It's not needed for other themes.
+ You should keep this at the top of whatever custom style you make to ensure the tabs aren't unusually large.*/
+QTabBar::tab { height: 5ex; }
+
+/*This is needed to give the labels on the status bar some padding.*/
+QStatusBar QLabel { padding-left: 2px; padding-right: 2px; }
+
+/*Specific styles below this line*/
+
+QObject
+{
+ background-color : rgb(53, 53, 53);
+ color: darkgray;
+ alternate-background-color: rgb(53, 53, 53);
+ selection-color: black;
+ selection-background-color: rgb(42, 130, 218);
+}
+
+QObject:disabled
+{
+ color: rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border-color: rgb(35, 35, 35);
+}
+
+QDockWidget::float-button
+{
+ background-color: gray;
+}
+
+QDockWidget::title
+{
+ margin: 1px;
+ padding: 2px;
+ background-color: gray;
+}
+
+QTabWidget::pane
+{
+ border: 1px solid gray;
+}
+
+QPushButton
+{
+ margin: 1px;
+ padding: 4px;
+ border: 1px solid gray;
+}
+
+QPushButton:pressed
+{
+ background-color: gray;
+}
+
+QPushButton:focus
+{
+ outline: none;
+}
+
+QTableView QPushButton
+{
+ border: 1px solid gray;
+ margin: 1px;
+ padding: 0px;
+}
+
+QLineEdit, QTextEdit
+{
+ border: 1px solid gray;
+ color: darkgray;
+ background-color: rgb(40, 40, 50);
+ selection-background-color: darkgray;
+}
+
+QToolTip
+{
+ background-color: darkgray;
+ border: 1px solid darkgray;
+}
+
+QSpinBox,
+QDoubleSpinBox
+{
+ padding-right: 0px;
+ color: darkgray;
+ selection-background-color: darkgray;
+ font: 8pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QCheckBox
+{
+ spacing: 5px;
+ outline: 0px;
+}
+
+QCheckBox::indicator,
+QTableView::indicator
+{
+ border: none;
+ border-radius: 2px;
+ background-color: lightgray;
+}
+
+QCheckBox::indicator:enabled:unchecked,
+QTableView::indicator:enabled:unchecked
+{
+ background-color: lightgray;
+ image: url(:/Fractorium/Icons/checkbox_unchecked.png);
+}
+
+QCheckBox::indicator:enabled:checked,
+QTableView::indicator:enabled:checked
+{
+ background-color: lightgray;
+ image: url(:/Fractorium/Icons/checkbox_checked.png);
+}
+
+QCheckBox::indicator:disabled:unchecked,
+QTableView::indicator:disabled:unchecked
+{
+ background-color: gray;
+ image: none;
+}
+
+QCheckBox::indicator:disabled:checked,
+QTableView::indicator:disabled:checked
+{
+ background-color: gray;
+ image: none;
+}
+
+QRadioButton::indicator:checked
+{
+ background-color: black;
+ border: 2px solid gray;
+ border-radius: 7px;
+ width: 8px;
+ height: 8px;
+ margin: 3px;
+ padding: 1px;
+}
+
+QRadioButton::indicator:checked:disabled
+{
+ background-color: rgb(35, 35, 35);
+}
+
+QRadioButton::indicator:unchecked
+{
+ border: 2px solid gray;
+ border-radius: 7px;
+ width: 8px;
+ height: 8px;
+ margin: 3px;
+ padding: 1px;
+}
+
+QComboBox
+{
+ margin: 0px;
+ padding-left: 4px;
+ border: 1px solid gray;
+}
+
+QComboBox::down-arrow:enabled
+{
+ border: 1px solid gray;
+ margin-right: 2px;
+ margin-top: 0px;
+ margin-bottom: 1px;
+}
+
+
+QComboBox::down-arrow:disabled
+{
+ border: 1px solid rgb(35, 35, 35);
+ margin-right: 2px;
+ margin-top: 0px;
+ margin-bottom: 1px;
+}
+
+QComboBox::drop-down
+{
+ border: none;
+}
+
+/*For some reason this is needed with Fusion, but not with Windows*/
+QComboBox::item:selected
+{
+ selection-background-color: darkgray;
+}
+
+QComboBox QAbstractItemView
+{
+ border: 1px solid gray;
+ outline: none;
+ selection-background-color: darkgray;
+}
+
+QTableView QComboBox
+{
+ margin: 1px;
+ padding: 0px;
+ padding-left: 3px;
+}
+
+QGroupBox QComboBox
+{
+ margin: 1px;
+ margin-bottom: 0px;
+}
+
+QTableView QComboBox::down-arrow
+{
+ margin-top: 0px;
+ margin-right: 1px;
+ margin-bottom: 0px;
+}
+
+QProgressBar
+{
+ color: black;
+ background-color: gray;
+ border: 0px none gray;
+ border-radius: 3px;
+ text-align: center;
+}
+
+QProgressBar::chunk
+{
+ border-radius: 3px;
+ background-color: lightgray;
+}
+
+QStatusBar QProgressBar
+{
+ min-width: 300px;
+ max-width: 300px;
+ margin-right: 4px;
+}
+
+QMenuBar
+{
+ border-bottom: 1px solid gray;
+}
+
+QMenuBar::item
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QMenu::item:disabled
+{
+ color: rgb(35, 35, 35);
+
+}
+
+QMenu::item:enabled:selected
+{
+ background-color: gray;
+}
+
+QMenu::item:disabled:selected
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QToolBar
+{
+ border: 0px none gray;
+}
+
+QGroupBox
+{
+ padding-top: 3px;
+ border: 2px solid gray;
+ border-radius: 4px;
+ margin-top: 3ex;
+}
+
+QGroupBox::title
+{
+ subcontrol-origin: border;
+ subcontrol-position: top left;
+ margin-top: -1ex;
+ margin-left: 0px;
+ padding-right: 1px;
+ padding-left: 2px;
+ top: -2ex;
+ left: 8px;
+}
+
+QListView
+{
+ selection-color: black;
+ selection-background-color: darkgray;
+}
+
+QListView::item:selected
+{
+ background-color: darkgray;
+}
+
+QTreeView
+{
+ border: 1px solid gray;
+ background-color: rgb(53, 53, 53);
+ font: 8pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+/*Setting this gives a more consistent look, but removes the ability to gray variations that are included in the xform*/
+QTreeView::item
+{
+ background-color: rgb(53, 53, 53);
+ color: darkgray;
+ outline: none;
+ margin-right: 1px;
+}
+
+QTreeView::item:hover
+{
+ border: 0px none black;
+ background-color: gray;
+ outline: none;
+}
+
+QTreeView::item:selected
+{
+ border: 0px none black;
+ background-color: gray;
+ outline: none;
+}
+
+QTreeView::branch:!has-children
+{
+ background: rgb(53, 53, 53);
+}
+
+QTreeView::branch:has-children:closed
+{
+ border: 1px solid darkgray;
+ background: gray;
+ margin: 2px;
+}
+
+QTreeView::branch:has-children:!closed
+{
+ border: 1px solid lightgray;
+ background: gray;
+ margin-left: 1px;
+ margin-right: 0px;
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+QTableView
+{
+ border-left: 0px none gray;
+ border-top: 0px none gray;
+ border-right: 0px none gray;
+ border-bottom: 0px none gray;
+ gridline-color: gray;
+ color: darkgray;
+ selection-color: darkgray;
+ selection-background-color: rgb(53, 53, 53);
+ font: 8pt "MS Shell Dlg";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QTableView QTableCornerButton::section:enabled
+{
+ background-color: darkgray;
+}
+
+QTableView QTableCornerButton::section:disabled
+{
+ background-color: rgb(53, 53, 53);
+}
+
+QTableView::indicator:disabled
+{
+ background-color: rgb(35, 35, 35);
+}
+
+QTableView:disabled
+{
+ color: rgb(35, 35, 35);
+ border: none;
+ gridline-color: rgb(35, 35, 35);
+}
+
+QHeaderView::section::vertical:enabled
+{
+ color: black;
+ background-color: gray;
+ border: none;
+ border-bottom: 1px solid gray;
+ padding: 4px;
+ font: 8pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::horizontal:enabled
+{
+ color: black;
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ border-right: 1px solid gray;
+ padding: 4px;
+ font: 8pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::vertical:disabled
+{
+ color: rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border: 0px none darkgray;
+ border-bottom: 1px solid rgb(53, 53, 53);
+ padding: 4px;
+ font: 8pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QHeaderView::section::horizontal:disabled
+{
+ color:rgb(35, 35, 35);
+ background-color: rgb(53, 53, 53);
+ border: 0px none darkgray;
+ border-right: 1px solid rgb(53, 53, 53);
+ padding: 4px;
+ font: 8pt "MS Shell Dlg 2";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/
+}
+
+QScrollBar::vertical
+{
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ width: 15px;
+ margin: 22px 0 22px 0;
+}
+
+QScrollBar::handle::vertical
+{
+ background-color: gray;
+ border-top: 1px solid darkgray;
+ border-bottom: 1px solid darkgray;
+ min-height: 20px;
+}
+
+QScrollBar::add-line::vertical
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ height: 22px;
+ subcontrol-position: bottom;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line::vertical
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ height: 22px;
+ subcontrol-position: top;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::up-arrow::vertical, QScrollBar::down-arrow::vertical
+{
+ border: 2px solid darkgray;
+ width: 5px;
+ height: 12px;
+ background-color: gray;
+}
+
+QScrollBar::add-page::vertical, QScrollBar::sub-page::vertical, QScrollBar::add-page::horizontal, QScrollBar::sub-page::horizontal
+{
+ background-color: darkgray;
+}
+
+QScrollBar::horizontal
+{
+ background-color: darkgray;
+ border: 0px solid darkgray;
+ height: 15px;
+ margin: 0px 20px 0 20px;
+}
+
+QScrollBar::handle::horizontal
+{
+ background-color: gray;
+ border-left: 1px solid darkgray;
+ border-right: 1px solid darkgray;
+ min-width: 20px;
+}
+
+QScrollBar::add-line::horizontal
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ width: 20px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line::horizontal
+{
+ border: 0px solid darkgray;
+ background-color: gray;
+ width: 20px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::left-arrow::horizontal, QScrollBar::right-arrow::horizontal
+{
+ border: 2px solid darkgray;
+ width: 12px;
+ height: 5px;
+ background-color: gray;
+}
+
+QMenu::separator
+{
+ height: 1px;
+ background-color: gray;
+}
+
+QToolBar::separator
+{
+ width: 1px;
+ margin-top: 3px;
+ margin-bottom: 2px;
+ background-color: gray;
+}
+
+QStatusBar::item
+{
+ border: none;
+}
+
+/*Specific controls*/
+QTableWidget#ColorTableHeader QHeaderView::section::horizontal,
+QTableWidget#GeometryTableHeader QHeaderView::section::horizontal,
+QTableWidget#FilterTableHeader QHeaderView::section::horizontal,
+QTableWidget#IterationTableHeader QHeaderView::section::horizontal,
+QTableWidget#AnimationTableHeader QHeaderView::section::horizontal,
+QTreeWidget#LibraryTree QHeaderView::section::horizontal
+{
+ border-right: none;
+}
+
+QTableWidget#ColorTable,
+QTableWidget#GeometryTable,
+QTableWidget#FilterTable,
+QTableWidget#IterationTable,
+QTableWidget#AnimationTable,
+QTableWidget#XformWeightNameTable
+{
+ border-left: 1px solid gray;
+}
+
+QTableWidget#SummaryTable
+{
+ border-left: 1px solid gray;
+}
+
+/*Normally doesn't matter, but when a palette file doesn't have enough palettes in it to fill the whole table, it looks funny without a border*/
+QTableWidget#PaletteListTable
+{
+ border: 1px solid gray;
+}
+
+QTableWidget#SummaryTable QHeaderView::section::vertical
+{
+ background-color: darkgray;
+}
+
+QTableWidget#PaletteAdjustTable,
+QTableWidget#PalettePreviewTable,
+QTableWidget#XformColorIndexTable,
+QTableWidget#XformColorValuesTable,
+QTableWidget#InfoBoundsTable,
+QTableWidget#OptionsXmlSavingTable,
+QTableWidget#OptionsIdentityTable,
+QTableWidget#FinalRenderSizeTable,
+QTableWidget#FinalRenderParamsTable
+{
+ border-left: 1px solid gray;
+ border-top: 1px solid gray;
+}
+
+QLineEdit#PaletteFilterLineEdit,
+QLineEdit#VariationsFilterLineEdit
+{
+ height: 20px;
+ min-height: 20px;
+ max-height: 20px;
+}
+
+QSpinBox#ThreadCountSpin,
+QSpinBox#RandomCountSpin,
+QSpinBox#CpuSubBatchSpin,
+QSpinBox#OpenCLSubBatchSpin,
+QSpinBox#FinalRenderCurrentSpin,
+QSpinBox#FinalRenderThreadCountSpin
+{
+ padding: 2px;
+ border: 1px solid gray;
+}
+
+QSpinBox#ThreadCountSpin:disabled,
+QSpinBox#CpuSubBatchSpin:disabled,
+QSpinBox#OpenCLSubBatchSpin:disabled,
+QSpinBox#FinalRenderCurrentSpin:disabled,
+QSpinBox#FinalRenderThreadCountSpin:disabled
+{
+ padding: 2px;
+ border: 1px solid rgb(35, 35, 35);
+}
+
+QTableView#FinalRenderParamsTable QComboBox
+{
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+QTableView#FinalRenderParamsTable QPushButton
+{
+ margin-top: 1px;
+ margin-bottom: 2px;
+ padding: 0px;
+}
diff --git a/Source/Ember/DensityFilter.h b/Source/Ember/DensityFilter.h
index 042a1ad..d71b0d1 100644
--- a/Source/Ember/DensityFilter.h
+++ b/Source/Ember/DensityFilter.h
@@ -141,7 +141,7 @@ public:
}
//Allocate the memory for these filters and the hit/width lookup array.
- rowSize = static_cast(2 * ceil(finalMaxRad) - 1);
+ rowSize = static_cast(2 * std::ceil(finalMaxRad) - 1);
m_FilterWidth = (rowSize - 1) / 2;
m_KernelSize = (m_FilterWidth + 1) * (2 + m_FilterWidth) / 2;
m_Coefs.resize(maxIndex * m_KernelSize);
diff --git a/Source/Ember/Interpolate.h b/Source/Ember/Interpolate.h
index fbfd99d..6160686 100644
--- a/Source/Ember/Interpolate.h
+++ b/Source/Ember/Interpolate.h
@@ -634,7 +634,7 @@ public:
t = xform->m_Post.m_Mat[col][2];
}
- cxAng[k][col] = atan2(c1[1], c1[0]);
+ cxAng[k][col] = std::atan2(c1[1], c1[0]);
cxMag[k][col] = std::sqrt(c1[0] * c1[0] + c1[1] * c1[1]);
if (cxMag[k][col] == 0)
@@ -722,7 +722,7 @@ public:
{
c1[0] = embers[k].GetXform(xfi)->m_Affine.m_Mat[0][col];//A,D then B,E.
c1[1] = embers[k].GetXform(xfi)->m_Affine.m_Mat[1][col];
- cxang[k][col] = atan2(c1[1], c1[0]);
+ cxang[k][col] = std::atan2(c1[1], c1[0]);
}
}
@@ -774,7 +774,7 @@ public:
{
for (i = 0; i < size; i++)
{
- if (log(cxMag[i][col]) < -10)
+ if (std::log(cxMag[i][col]) < -10)
accmode[col] = 1;//Mode set to linear interp.
}
}
@@ -926,8 +926,8 @@ public:
if (bd < 0) return true;
- ad = atan2(a.m_Affine.A(), a.m_Affine.D());
- bd = atan2(b.m_Affine.A(), b.m_Affine.D());
+ ad = std::atan2(a.m_Affine.A(), a.m_Affine.D());
+ bd = std::atan2(b.m_Affine.A(), b.m_Affine.D());
}
return ad > bd;
diff --git a/Source/Ember/Renderer.cpp b/Source/Ember/Renderer.cpp
index cad78fb..3b4f6f8 100644
--- a/Source/Ember/Renderer.cpp
+++ b/Source/Ember/Renderer.cpp
@@ -919,18 +919,17 @@ eRenderStatus Renderer::GaussianDensityFilter()
for (intmax_t j = localStartRow; (j < localEndRow) && !m_Abort; j++)
{
- size_t bucketRowStart = j * m_SuperRasW;//Pull out of inner loop for optimization.
- const tvec4* bucket;
- const tvec4* buckets = m_HistBuckets.data();
- const bucketT* filterCoefs = m_DensityFilter->Coefs();
- const bucketT* filterWidths = m_DensityFilter->Widths();
+ auto buckets = m_HistBuckets.data();
+ auto bucketRowStart = buckets + (j * m_SuperRasW);//Pull out of inner loop for optimization.
+ auto filterCoefs = m_DensityFilter->Coefs();
+ auto filterWidths = m_DensityFilter->Widths();
for (intmax_t i = startCol; i < endCol; i++)
{
intmax_t ii, jj, arrFilterWidth;
size_t filterSelectInt, filterCoefIndex;
T filterSelect = 0;
- bucket = buckets + bucketRowStart + i;
+ auto bucket = bucketRowStart + i;
//Don't do anything if there's no hits here. Must also put this first to avoid dividing by zero below.
if (bucket->a == 0)
diff --git a/Source/Ember/Utils.h b/Source/Ember/Utils.h
index fe4d249..0896a0b 100644
--- a/Source/Ember/Utils.h
+++ b/Source/Ember/Utils.h
@@ -684,7 +684,7 @@ static inline void ClampGte0Ref(T& val)
template
static inline T Round(T r)
{
- return (r > 0) ? static_cast(Floor(r + T(0.5))) : ceil(r - T(0.5));
+ return (r > 0) ? static_cast(Floor(r + T(0.5))) : std::ceil(r - T(0.5));
}
///
diff --git a/Source/Ember/Variation.h b/Source/Ember/Variation.h
index e9d33eb..43f60e6 100644
--- a/Source/Ember/Variation.h
+++ b/Source/Ember/Variation.h
@@ -1226,10 +1226,10 @@ public:
}
if (m_NeedPrecalcAtanXY)
- iteratorHelper.m_PrecalcAtanxy = atan2(iteratorHelper.In.x, iteratorHelper.In.y);
+ iteratorHelper.m_PrecalcAtanxy = std::atan2(iteratorHelper.In.x, iteratorHelper.In.y);
if (m_NeedPrecalcAtanYX)
- iteratorHelper.m_PrecalcAtanyx = atan2(iteratorHelper.In.y, iteratorHelper.In.x);
+ iteratorHelper.m_PrecalcAtanyx = std::atan2(iteratorHelper.In.y, iteratorHelper.In.x);
}
///
@@ -2328,4 +2328,4 @@ protected:
\
PREPOSTPARVARCOPY(Post##varName##Variation, varName##Variation) \
};
- }
+}
diff --git a/Source/Ember/Variations01.h b/Source/Ember/Variations01.h
index f7fdb3f..4fdef5f 100644
--- a/Source/Ember/Variations01.h
+++ b/Source/Ember/Variations01.h
@@ -2883,9 +2883,10 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
- T ct = helper.In.x / helper.m_PrecalcSqrtSumSquares;
+ T z = Zeps(helper.m_PrecalcSqrtSumSquares);
+ T ct = helper.In.x / z;
T r = m_Weight * (rand.Frand01() - m_Holes) *
- m_Eccentricity / (1 + m_Eccentricity * ct) / helper.m_PrecalcSqrtSumSquares;
+ m_Eccentricity / (1 + m_Eccentricity * ct) / z;
helper.Out.x = r * helper.In.x;
helper.Out.y = r * helper.In.y;
helper.Out.z = DefaultZ(helper);
@@ -2900,8 +2901,9 @@ public:
string eccentricity = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string holes = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
+ << "\t\treal_t z = Zeps(precalcSqrtSumSquares);\n"
<< "\t\treal_t ct = vIn.x / precalcSqrtSumSquares;\n"
- << "\t\treal_t r = xform->m_VariationWeights[" << varIndex << "] * (MwcNext01(mwc) - " << holes << ") * " << eccentricity << " / (1 + " << eccentricity << " * ct) / precalcSqrtSumSquares;\n"
+ << "\t\treal_t r = xform->m_VariationWeights[" << varIndex << "] * (MwcNext01(mwc) - " << holes << ") * " << eccentricity << " / (1 + " << eccentricity << " * ct) / z;\n"
<< "\n"
<< "\t\tvOut.x = r * vIn.x;\n"
<< "\t\tvOut.y = r * vIn.y;\n"
@@ -2910,6 +2912,11 @@ public:
return ss.str();
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
virtual void Random(QTIsaac& rand) override
{
m_Eccentricity = rand.Frand01();
@@ -3096,7 +3103,7 @@ public:
const T x2y2 = helper.m_PrecalcSumSquares;
const T t = x2y2 + 1;
const T x2 = 2 * helper.In.x;
- T y = T(0.5) * atan2(2 * helper.In.y, x2y2 - 1) + m_S;
+ T y = T(0.5) * std::atan2(2 * helper.In.y, x2y2 - 1) + m_S;
if (y > T(M_PI_2))
y = -T(M_PI_2) + fmod(y + T(M_PI_2), T(M_PI));
@@ -3123,7 +3130,7 @@ public:
}
else
{
- helper.Out.x = m_V4 * std::log((t + x2) / (t - x2));
+ helper.Out.x = m_V4 * std::log((t + x2) / Zeps(t - x2));
helper.Out.y = m_V * y;
helper.Out.z = m_Weight * helper.In.z;
}
@@ -3176,7 +3183,7 @@ public:
ss << "\t\telse\n"
<< "\t\t{\n"
- << "\t\t vOut.x = (" << v4 << " * log((t + x2) / (t - x2)));\n"
+ << "\t\t vOut.x = (" << v4 << " * log((t + x2) / Zeps(t - x2)));\n"
<< "\t\t vOut.y = (" << v << " * y);\n"
<< "\t\t vOut.z = xform->m_VariationWeights[" << varIndex << "] * vIn.z;\n"
<< "\t\t}\n"
@@ -3196,6 +3203,11 @@ public:
m_Shift = 2 * rand.Frand01() - 1;
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
virtual bool SetParamVal(const char* name, T val) override
{
if (!_stricmp(name, "bipolar_shift"))
@@ -3394,8 +3406,8 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
T invCellSize = 1 / m_Size;
- T x = floor(helper.In.x * invCellSize);//Calculate input cell. Note that int cast is omitted here. See below.
- T y = floor(helper.In.y * invCellSize);
+ T x = std::floor(helper.In.x * invCellSize);//Calculate input cell. Note that int cast is omitted here. See below.
+ T y = std::floor(helper.In.y * invCellSize);
T dx = helper.In.x - x * m_Size;//Offset from cell origin.
T dy = helper.In.y - y * m_Size;
@@ -3696,14 +3708,14 @@ public:
T tmp2 = 2 * helper.In.x;
T r1 = std::sqrt(tmp + tmp2);
T r2 = std::sqrt(tmp - tmp2);
- T xmax = (r1 + r2) * T(0.5);
+ T xmax = Zeps((r1 + r2) * T(0.5));
T a1 = std::log(xmax + std::sqrt(xmax - 1));
T a2 = -std::acos(Clamp(helper.In.x / xmax, -1, 1));
T w = m_Weight / T(11.57034632);//This is an interesting magic number.
T snv, csv, snhu, cshu;
sincos(a1, &snv, &csv);
- snhu = sinh(a2);
- cshu = cosh(a2);
+ snhu = std::sinh(a2);
+ cshu = std::cosh(a2);
if (helper.In.y > 0.0)
snv = -snv;
@@ -3722,7 +3734,7 @@ public:
<< "\t\treal_t tmp2 = (real_t)(2.0) * vIn.x;\n"
<< "\t\treal_t r1 = sqrt(tmp + tmp2);\n"
<< "\t\treal_t r2 = sqrt(tmp - tmp2);\n"
- << "\t\treal_t xmax = (r1 + r2) * (real_t)(0.5);\n"
+ << "\t\treal_t xmax = Zeps((r1 + r2) * (real_t)(0.5));\n"
<< "\t\treal_t a1 = log(xmax + sqrt(xmax - (real_t)(1.0)));\n"
<< "\t\treal_t a2 = -acos(clamp(vIn.x / xmax, -(real_t)(1.0), (real_t)(1.0)));\n"
<< "\t\treal_t w = xform->m_VariationWeights[" << varIndex << "] / (real_t)(11.57034632);\n"
@@ -3738,6 +3750,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -3774,7 +3791,7 @@ public:
else
ssx = std::sqrt(ssx);
- helper.Out.x = w * atan2(a, b);
+ helper.Out.x = w * std::atan2(a, b);
if (helper.In.y > 0)
helper.Out.y = w * std::log(xmax + ssx);
@@ -3997,7 +4014,7 @@ public:
if (r < m_Weight)
{
- T a = atan2(y, x) + m_Spin + m_Twist * (m_Weight - r);
+ T a = std::atan2(y, x) + m_Spin + m_Twist * (m_Weight - r);
helper.Out.x = m_Weight * (r * std::cos(a) + m_X);//Fix to make it colapse to 0 when weight is 0.//SMOULDER
helper.Out.y = m_Weight * (r * std::sin(a) - m_Y);
}
@@ -4657,12 +4674,12 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
- if (cos(helper.In.y * m_YAng) >= 0)
+ if (std::cos(helper.In.y * m_YAng) >= 0)
helper.Out.x = m_Weight * helper.In.x;
else
helper.Out.x = -(m_Weight * helper.In.x);
- if (cos(helper.In.x * m_XAng) >= 0)
+ if (std::cos(helper.In.x * m_XAng) >= 0)
helper.Out.y = m_Weight * helper.In.y;
else
helper.Out.y = -(m_Weight * helper.In.y);
@@ -5151,7 +5168,7 @@ public:
if (r < m_Weight)
a = helper.m_PrecalcAtanyx + m_Inside / (m_Weight - r);
else
- a = helper.m_PrecalcAtanyx + m_Outside / (m_Weight - r);
+ a = helper.m_PrecalcAtanyx + m_Outside / Zeps(m_Weight - r);
helper.Out.x = m_Weight * r * std::cos(a);
helper.Out.y = m_Weight * r * std::sin(a);
@@ -5173,7 +5190,7 @@ public:
<< "\t\tif (r < xform->m_VariationWeights[" << varIndex << "])\n"
<< "\t\t a = precalcAtanyx + " << inside << " / (xform->m_VariationWeights[" << varIndex << "] - r);\n"
<< "\t\telse\n"
- << "\t\t a = precalcAtanyx + " << outside << " / (xform->m_VariationWeights[" << varIndex << "] - r);\n"
+ << "\t\t a = precalcAtanyx + " << outside << " / Zeps(xform->m_VariationWeights[" << varIndex << "] - r);\n"
<< "\n"
<< "\t\tvOut.x = (xform->m_VariationWeights[" << varIndex << "] * r * cos(a));\n"
<< "\t\tvOut.y = (xform->m_VariationWeights[" << varIndex << "] * r * sin(a));\n"
@@ -5182,6 +5199,11 @@ public:
return ss.str();
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
virtual void Random(QTIsaac& rand) override
{
m_Inside = rand.Frand01();
@@ -5378,8 +5400,8 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
- helper.Out.x = m_Weight * std::sin(helper.In.x) * cosh(helper.In.y);
- helper.Out.y = m_Weight * std::cos(helper.In.x) * sinh(helper.In.y);
+ helper.Out.x = m_Weight * std::sin(helper.In.x) * std::cosh(helper.In.y);
+ helper.Out.y = m_Weight * std::cos(helper.In.x) * std::sinh(helper.In.y);
helper.Out.z = DefaultZ(helper);
}
@@ -5410,8 +5432,8 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
//clamp fabs x and y to 7.104760e+002 for cosh, and |x| 7.104760e+002 for sinh
- helper.Out.x = m_Weight * std::cos(helper.In.x) * cosh(helper.In.y);
- helper.Out.y = -(m_Weight * std::sin(helper.In.x) * sinh(helper.In.y));
+ helper.Out.x = m_Weight * std::cos(helper.In.x) * std::cosh(helper.In.y);
+ helper.Out.y = -(m_Weight * std::sin(helper.In.x) * std::sinh(helper.In.y));
helper.Out.z = DefaultZ(helper);
}
@@ -5443,9 +5465,9 @@ public:
{
T tansin, tancos, tansinh, tancosh, tanden;
sincos(2 * helper.In.x, &tansin, &tancos);
- tansinh = sinh(2 * helper.In.y);
- tancosh = cosh(2 * helper.In.y);
- tanden = 1 / (tancos + tancosh);
+ tansinh = std::sinh(2 * helper.In.y);
+ tancosh = std::cosh(2 * helper.In.y);
+ tanden = 1 / Zeps(tancos + tancosh);
helper.Out.x = m_Weight * tanden * tansin;
helper.Out.y = m_Weight * tanden * tansinh;
helper.Out.z = DefaultZ(helper);
@@ -5460,7 +5482,7 @@ public:
<< "\t\treal_t tancos = cos((real_t)(2.0) * vIn.x);\n"
<< "\t\treal_t tansinh = sinh((real_t)(2.0) * vIn.y);\n"
<< "\t\treal_t tancosh = cosh((real_t)(2.0) * vIn.y);\n"
- << "\t\treal_t tanden = (real_t)(1.0) / (tancos + tancosh);\n"
+ << "\t\treal_t tanden = (real_t)(1.0) / Zeps(tancos + tancosh);\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * tanden * tansin;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * tanden * tansinh;\n"
@@ -5468,6 +5490,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5485,9 +5512,9 @@ public:
{
T secsin, seccos, secsinh, seccosh, secden;
sincos(helper.In.x, &secsin, &seccos);
- secsinh = sinh(helper.In.y);
- seccosh = cosh(helper.In.y);
- secden = 2 / (cos(2 * helper.In.x) + cosh(2 * helper.In.y));
+ secsinh = std::sinh(helper.In.y);
+ seccosh = std::cosh(helper.In.y);
+ secden = 2 / Zeps(std::cos(2 * helper.In.x) + std::cosh(2 * helper.In.y));
helper.Out.x = m_Weight * secden * seccos * seccosh;
helper.Out.y = m_Weight * secden * secsin * secsinh;
helper.Out.z = DefaultZ(helper);
@@ -5502,7 +5529,7 @@ public:
<< "\t\treal_t seccos = cos(vIn.x);\n"
<< "\t\treal_t secsinh = sinh(vIn.y);\n"
<< "\t\treal_t seccosh = cosh(vIn.y);\n"
- << "\t\treal_t secden = (real_t)(2.0) / (cos((real_t)(2.0) * vIn.x) + cosh((real_t)(2.0) * vIn.y));\n"
+ << "\t\treal_t secden = (real_t)(2.0) / Zeps(cos((real_t)(2.0) * vIn.x) + cosh((real_t)(2.0) * vIn.y));\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * secden * seccos * seccosh;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * secden * secsin * secsinh;\n"
@@ -5510,6 +5537,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5529,7 +5561,7 @@ public:
sincos(helper.In.x, &cscsin, &csccos);
cscsinh = std::sinh(helper.In.y);
csccosh = std::cosh(helper.In.y);
- cscden = 2 / (std::cosh(2 * helper.In.y) - std::cos(2 * helper.In.x));
+ cscden = 2 / Zeps(std::cosh(2 * helper.In.y) - std::cos(2 * helper.In.x));
helper.Out.x = m_Weight * cscden * cscsin * csccosh;
helper.Out.y = -(m_Weight * cscden * csccos * cscsinh);
helper.Out.z = DefaultZ(helper);
@@ -5544,7 +5576,7 @@ public:
<< "\t\treal_t csccos = cos(vIn.x);\n"
<< "\t\treal_t cscsinh = sinh(vIn.y);\n"
<< "\t\treal_t csccosh = cosh(vIn.y);\n"
- << "\t\treal_t cscden = (real_t)(2.0) / (cosh((real_t)(2.0) * vIn.y) - cos((real_t)(2.0) * vIn.x));\n"
+ << "\t\treal_t cscden = (real_t)(2.0) / Zeps(cosh((real_t)(2.0) * vIn.y) - cos((real_t)(2.0) * vIn.x));\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * cscden * cscsin * csccosh;\n"
<< "\t\tvOut.y = -(xform->m_VariationWeights[" << varIndex << "] * cscden * csccos * cscsinh);\n"
@@ -5552,6 +5584,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5569,9 +5606,9 @@ public:
{
T cotsin, cotcos, cotsinh, cotcosh, cotden;
sincos(2 * helper.In.x, &cotsin, &cotcos);
- cotsinh = sinh(2 * helper.In.y);
- cotcosh = cosh(2 * helper.In.y);
- cotden = 1 / (cotcosh - cotcos);
+ cotsinh = std::sinh(2 * helper.In.y);
+ cotcosh = std::cosh(2 * helper.In.y);
+ cotden = 1 / Zeps(cotcosh - cotcos);
helper.Out.x = m_Weight * cotden * cotsin;
helper.Out.y = m_Weight * cotden * -1 * cotsinh;
helper.Out.z = DefaultZ(helper);
@@ -5586,7 +5623,7 @@ public:
<< "\t\treal_t cotcos = cos((real_t)(2.0) * vIn.x);\n"
<< "\t\treal_t cotsinh = sinh((real_t)(2.0) * vIn.y);\n"
<< "\t\treal_t cotcosh = cosh((real_t)(2.0) * vIn.y);\n"
- << "\t\treal_t cotden = (real_t)(1.0) / (cotcosh - cotcos);\n"
+ << "\t\treal_t cotden = (real_t)(1.0) / Zeps(cotcosh - cotcos);\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * cotden * cotsin;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * cotden * -1 * cotsinh;\n"
@@ -5594,6 +5631,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5611,8 +5653,8 @@ public:
{
T sinhsin, sinhcos, sinhsinh, sinhcosh;
sincos(helper.In.y, &sinhsin, &sinhcos);
- sinhsinh = sinh(helper.In.x);
- sinhcosh = cosh(helper.In.x);
+ sinhsinh = std::sinh(helper.In.x);
+ sinhcosh = std::cosh(helper.In.x);
helper.Out.x = m_Weight * sinhsinh * sinhcos;
helper.Out.y = m_Weight * sinhcosh * sinhsin;
helper.Out.z = DefaultZ(helper);
@@ -5651,8 +5693,8 @@ public:
{
T coshsin, coshcos, coshsinh, coshcosh;
sincos(helper.In.y, &coshsin, &coshcos);
- coshsinh = sinh(helper.In.x);
- coshcosh = cosh(helper.In.x);
+ coshsinh = std::sinh(helper.In.x);
+ coshcosh = std::cosh(helper.In.x);
helper.Out.x = m_Weight * coshcosh * coshcos;
helper.Out.y = m_Weight * coshsinh * coshsin;
helper.Out.z = DefaultZ(helper);
@@ -5691,9 +5733,9 @@ public:
{
T tanhsin, tanhcos, tanhsinh, tanhcosh, tanhden;
sincos(2 * helper.In.y, &tanhsin, &tanhcos);
- tanhsinh = sinh(2 * helper.In.x);
- tanhcosh = cosh(2 * helper.In.x);
- tanhden = 1 / (tanhcos + tanhcosh);
+ tanhsinh = std::sinh(2 * helper.In.x);
+ tanhcosh = std::cosh(2 * helper.In.x);
+ tanhden = 1 / Zeps(tanhcos + tanhcosh);
helper.Out.x = m_Weight * tanhden * tanhsinh;
helper.Out.y = m_Weight * tanhden * tanhsin;
helper.Out.z = DefaultZ(helper);
@@ -5708,7 +5750,7 @@ public:
<< "\t\treal_t tanhcos = cos((real_t)(2.0) * vIn.y);\n"
<< "\t\treal_t tanhsinh = sinh((real_t)(2.0) * vIn.x);\n"
<< "\t\treal_t tanhcosh = cosh((real_t)(2.0) * vIn.x);\n"
- << "\t\treal_t tanhden = (real_t)(1.0) / (tanhcos + tanhcosh);\n"
+ << "\t\treal_t tanhden = (real_t)(1.0) / Zeps(tanhcos + tanhcosh);\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * tanhden * tanhsinh;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * tanhden * tanhsin;\n"
@@ -5716,6 +5758,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5733,9 +5780,9 @@ public:
{
T sechsin, sechcos, sechsinh, sechcosh, sechden;
sincos(helper.In.y, &sechsin, &sechcos);
- sechsinh = sinh(helper.In.x);
- sechcosh = cosh(helper.In.x);
- sechden = 2 / (cos(2 * helper.In.y) + cosh(2 * helper.In.x));
+ sechsinh = std::sinh(helper.In.x);
+ sechcosh = std::cosh(helper.In.x);
+ sechden = 2 / Zeps(std::cos(2 * helper.In.y) + std::cosh(2 * helper.In.x));
helper.Out.x = m_Weight * sechden * sechcos * sechcosh;
helper.Out.y = -(m_Weight * sechden * sechsin * sechsinh);
helper.Out.z = DefaultZ(helper);
@@ -5750,7 +5797,7 @@ public:
<< "\t\treal_t sechcos = cos(vIn.y);\n"
<< "\t\treal_t sechsinh = sinh(vIn.x);\n"
<< "\t\treal_t sechcosh = cosh(vIn.x);\n"
- << "\t\treal_t sechden = (real_t)(2.0) / (cos((real_t)(2.0) * vIn.y) + cosh((real_t)(2.0) * vIn.x));\n"
+ << "\t\treal_t sechden = (real_t)(2.0) / Zeps(cos((real_t)(2.0) * vIn.y) + cosh((real_t)(2.0) * vIn.x));\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * sechden * sechcos * sechcosh;\n"
<< "\t\tvOut.y = -(xform->m_VariationWeights[" << varIndex << "] * sechden * sechsin * sechsinh);\n"
@@ -5758,6 +5805,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5777,7 +5829,7 @@ public:
sincos(helper.In.y, &cschsin, &cschcos);
cschsinh = std::sinh(helper.In.x);
cschcosh = std::cosh(helper.In.x);
- cschden = 2 / (std::cosh(2 * helper.In.x) - std::cos(2 * helper.In.y));
+ cschden = 2 / Zeps(std::cosh(2 * helper.In.x) - std::cos(2 * helper.In.y));
helper.Out.x = m_Weight * cschden * cschsinh * cschcos;
helper.Out.y = -(m_Weight * cschden * cschcosh * cschsin);
helper.Out.z = DefaultZ(helper);
@@ -5792,7 +5844,7 @@ public:
<< "\t\treal_t cschcos = cos(vIn.y);\n"
<< "\t\treal_t cschsinh = sinh(vIn.x);\n"
<< "\t\treal_t cschcosh = cosh(vIn.x);\n"
- << "\t\treal_t cschden = (real_t)(2.0) / (cosh((real_t)(2.0) * vIn.x) - cos((real_t)(2.0) * vIn.y));\n"
+ << "\t\treal_t cschden = (real_t)(2.0) / Zeps(cosh((real_t)(2.0) * vIn.x) - cos((real_t)(2.0) * vIn.y));\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * cschden * cschsinh * cschcos;\n"
<< "\t\tvOut.y = -(xform->m_VariationWeights[" << varIndex << "] * cschden * cschcosh * cschsin);\n"
@@ -5800,6 +5852,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5817,9 +5874,9 @@ public:
{
T cothsin, cothcos, cothsinh, cothcosh, cothden;
sincos(2 * helper.In.y, &cothsin, &cothcos);
- cothsinh = sinh(2 * helper.In.x);
- cothcosh = cosh(2 * helper.In.x);
- cothden = 1 / (cothcosh - cothcos);
+ cothsinh = std::sinh(2 * helper.In.x);
+ cothcosh = std::cosh(2 * helper.In.x);
+ cothden = 1 / Zeps(cothcosh - cothcos);
helper.Out.x = m_Weight * cothden * cothsinh;
helper.Out.y = m_Weight * cothden * cothsin;
helper.Out.z = DefaultZ(helper);
@@ -5834,7 +5891,7 @@ public:
<< "\t\treal_t cothcos = cos((real_t)(2.0) * vIn.y);\n"
<< "\t\treal_t cothsinh = sinh((real_t)(2.0) * vIn.x);\n"
<< "\t\treal_t cothcosh = cosh((real_t)(2.0) * vIn.x);\n"
- << "\t\treal_t cothden = (real_t)(1.0) / (cothcosh - cothcos);\n"
+ << "\t\treal_t cothden = (real_t)(1.0) / Zeps(cothcosh - cothcos);\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * cothden * cothsinh;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * cothden * cothsin;\n"
@@ -5842,6 +5899,11 @@ public:
<< "\t}\n";
return ss.str();
}
+
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
};
///
@@ -5862,8 +5924,8 @@ public:
{
T s = std::sin(m_Freq * helper.In.x);
T t = std::sin(m_Freq * helper.In.y);
- T dy = helper.In.y + m_AugerWeight * (m_Scale * s / 2 + std::abs(helper.In.y) * s);
- T dx = helper.In.x + m_AugerWeight * (m_Scale * t / 2 + std::abs(helper.In.x) * t);
+ T dy = helper.In.y + m_AugerWeight * (m_Scale * s / Zeps(2 + std::abs(helper.In.y) * s));
+ T dx = helper.In.x + m_AugerWeight * (m_Scale * t / Zeps(2 + std::abs(helper.In.x) * t));
helper.Out.x = m_Weight * (helper.In.x + m_Symmetry * (dx - helper.In.x));
helper.Out.y = m_Weight * dy;
helper.Out.z = m_Weight * helper.In.z;
@@ -5882,8 +5944,8 @@ public:
ss << "\t{\n"
<< "\t\treal_t s = sin(" << freq << " * vIn.x);\n"
<< "\t\treal_t t = sin(" << freq << " * vIn.y);\n"
- << "\t\treal_t dy = vIn.y + " << augerWeight << " * (" << scale << " * s / (real_t)(2.0) + fabs(vIn.y) * s);\n"
- << "\t\treal_t dx = vIn.x + " << augerWeight << " * (" << scale << " * t / (real_t)(2.0) + fabs(vIn.x) * t);\n"
+ << "\t\treal_t dy = vIn.y + " << augerWeight << " * (" << scale << " * s / Zeps((real_t)(2.0) + fabs(vIn.y) * s));\n"
+ << "\t\treal_t dx = vIn.x + " << augerWeight << " * (" << scale << " * t / Zeps((real_t)(2.0) + fabs(vIn.x) * t));\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * (vIn.x + " << symmetry << " * (dx - vIn.x));\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * dy;\n"
@@ -5900,6 +5962,11 @@ public:
m_Scale = rand.Frand01();
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -5943,7 +6010,7 @@ public:
frac = 1;
T avgr = m_Weight * (m_Spr * std::sqrt(std::sqrt(yy + SQR(xpw)) / frac));
- T avga = (atan2(helper.In.y, xmw) - atan2(helper.In.y, xpw)) * T(0.5);
+ T avga = (std::atan2(helper.In.y, xmw) - std::atan2(helper.In.y, xpw)) * T(0.5);
helper.Out.x = avgr * std::cos(avga);
helper.Out.y = avgr * std::sin(avga);
helper.Out.z = helper.In.z;//Apo does not use weight, sums only z. Sum here for reg, else assign.
diff --git a/Source/Ember/Variations02.h b/Source/Ember/Variations02.h
index 917276c..16b38a7 100644
--- a/Source/Ember/Variations02.h
+++ b/Source/Ember/Variations02.h
@@ -155,7 +155,7 @@ public:
{
lx *= m_G2;
ly *= m_G2;
- T r = m_Rfactor / ((SQR(lx) + SQR(ly)) / 4 + 1);
+ T r = m_Rfactor / Zeps((SQR(lx) + SQR(ly)) / 4 + 1);
lx *= r;
ly *= r;
r = (SQR(lx) + SQR(ly)) / m_R2;
@@ -211,7 +211,7 @@ public:
<< "\t\t lx *= " << g2 << ";\n"
<< "\t\t ly *= " << g2 << ";\n"
<< "\n"
- << "\t\t real_t r = " << rfactor << " / ((SQR(lx) + SQR(ly)) / 4 + 1);\n"
+ << "\t\t real_t r = " << rfactor << " / Zeps((SQR(lx) + SQR(ly)) / 4 + 1);\n"
<< "\n"
<< "\t\t lx *= r;\n"
<< "\t\t ly *= r;\n"
@@ -245,10 +245,15 @@ public:
else
maxBubble *= (1 / (SQR(maxBubble) / 4 + 1));
- m_R2 = SQR(radius);
+ m_R2 = Zeps(SQR(radius));
m_Rfactor = radius / maxBubble;
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -1957,7 +1962,7 @@ public:
{
T s, c;
T avgr = m_Weight * (std::sqrt(SQR(helper.In.y) + SQR(helper.In.x + 1)) / std::sqrt(SQR(helper.In.y) + SQR(helper.In.x - 1)));
- T avga = (atan2(helper.In.y, helper.In.x - 1) - atan2(helper.In.y, helper.In.x + 1)) / 2;
+ T avga = (atan2(helper.In.y, helper.In.x - 1) - std::atan2(helper.In.y, helper.In.x + 1)) / 2;
sincos(avga, &s, &c);
helper.Out.x = avgr * c;
helper.Out.y = avgr * s;
@@ -2033,7 +2038,7 @@ public:
virtual void Precalc() override
{
m_K = T(0.5) * std::log(Zeps(SQR(m_Real) + SQR(m_Imag)));//Original used 1e-300, which isn't representable with a float.
- m_T = atan2(m_Imag, m_Real);
+ m_T = std::atan2(m_Imag, m_Real);
}
protected:
@@ -2958,7 +2963,7 @@ public:
T r2 = helper.m_PrecalcSumSquares + helper.In.z;
T x2cx = m_C2x * helper.In.x;
T y2cy = m_C2y * helper.In.y;
- T d = m_Weight / (m_C2 * r2 + x2cx - y2cy + 1);
+ T d = m_Weight / Zeps(m_C2 * r2 + x2cx - y2cy + 1);
helper.Out.x = d * (helper.In.x * m_S2x - m_Cx * ( y2cy - r2 - 1));
helper.Out.y = d * (helper.In.y * m_S2y + m_Cy * (-x2cx - r2 - 1));
helper.Out.z = d * (helper.In.z * m_S2z);
@@ -2987,7 +2992,7 @@ public:
<< "\t\treal_t r2 = precalcSumSquares + vIn.z;\n"
<< "\t\treal_t x2cx = " << c2x << " * vIn.x;\n"
<< "\t\treal_t y2cy = " << c2y << " * vIn.y;\n"
- << "\t\treal_t d = xform->m_VariationWeights[" << varIndex << "] / (" << c2 << " * r2 + x2cx - y2cy + 1);\n"
+ << "\t\treal_t d = xform->m_VariationWeights[" << varIndex << "] / Zeps(" << c2 << " * r2 + x2cx - y2cy + 1);\n"
<< "\n"
<< "\t\tvOut.x = d * (vIn.x * " << s2x << " - " << cx << "* ( y2cy - r2 - 1));\n"
<< "\t\tvOut.y = d * (vIn.y * " << s2y << " + " << cy << "* (-x2cx - r2 - 1));\n"
@@ -3018,6 +3023,11 @@ public:
m_S2z = 1 - SQR(m_Cy) - SQR(m_Cx);
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -3078,7 +3088,7 @@ public:
T r2 = helper.m_PrecalcSumSquares + SQR(helper.In.z);
T x2cx = 2 * cx * helper.In.x;
T y2cy = 2 * cy * helper.In.x;
- T d = m_Weight / (m_C2 * r2 + x2cx - y2cy + 1);
+ T d = m_Weight / Zeps(m_C2 * r2 + x2cx - y2cy + 1);
helper.Out.x = d * (helper.In.x * s2x - cx * ( y2cy - r2 - 1));
helper.Out.y = d * (helper.In.y * s2y + cy * (-x2cx - r2 - 1));
helper.Out.z = d * (helper.In.z * m_S2z);
@@ -3105,7 +3115,7 @@ public:
<< "\t\treal_t r2 = precalcSumSquares + SQR(vIn.z);\n"
<< "\t\treal_t x2cx = 2 * cx * vIn.x;\n"
<< "\t\treal_t y2cy = 2 * cy * vIn.x;\n"
- << "\t\treal_t d = xform->m_VariationWeights[" << varIndex << "] / (" << c2 << " * r2 + x2cx - y2cy + 1);\n"
+ << "\t\treal_t d = xform->m_VariationWeights[" << varIndex << "] / Zeps(" << c2 << " * r2 + x2cx - y2cy + 1);\n"
<< "\n"
<< "\t\tvOut.x = d * (vIn.x * s2x - cx * ( y2cy - r2 - 1));\n"
<< "\t\tvOut.y = d * (vIn.y * s2y + cy * (-x2cx - r2 - 1));\n"
@@ -3131,6 +3141,11 @@ public:
m_S2z = 1 - m_C2;
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -3811,10 +3826,10 @@ public:
{
if (helper.In.x >= 0)
{
- xo = (r + 1) / (2 * helper.In.x);
+ xo = (r + 1) / Zeps(2 * helper.In.x);
ro = std::sqrt(SQR(helper.In.x - xo) + SQR(helper.In.y));
- theta = atan2(T(1), ro);
- a = fmod(m_In * theta + atan2(helper.In.y, xo - helper.In.x) + theta, 2 * theta) - theta;
+ theta = std::atan2(T(1), ro);
+ a = fmod(m_In * theta + std::atan2(helper.In.y, xo - helper.In.x) + theta, 2 * theta) - theta;
sincos(a, &s, &c);
helper.Out.x = m_Weight * (xo - c * ro);
helper.Out.y = m_Weight * s * ro;
@@ -3823,8 +3838,8 @@ public:
{
xo = - (r + 1) / (2 * helper.In.x);
ro = std::sqrt(SQR(-helper.In.x - xo) + SQR(helper.In.y));
- theta = atan2(T(1), ro);
- a = fmod(m_In * theta + atan2(helper.In.y, xo + helper.In.x) + theta, 2 * theta) - theta;
+ theta = std::atan2(T(1), ro);
+ a = fmod(m_In * theta + std::atan2(helper.In.y, xo + helper.In.x) + theta, 2 * theta) - theta;
sincos(a, &s, &c);
helper.Out.x = -(m_Weight * (xo - c * ro));
helper.Out.y = m_Weight * s * ro;
@@ -3840,10 +3855,10 @@ public:
if (x >= 0)
{
- xo = (SQR(x) + SQR(y) + 1) / (2 * x);
+ xo = (SQR(x) + SQR(y) + 1) / Zeps(2 * x);
ro = std::sqrt(SQR(x - xo) + SQR(y));
theta = std::atan2(T(1), ro);
- a = fmod(m_Out * theta + atan2(y, xo - x) + theta, 2 * theta) - theta;
+ a = fmod(m_Out * theta + std::atan2(y, xo - x) + theta, 2 * theta) - theta;
sincos(a, &s, &c);
x = (xo - c * ro);
y = s * ro;
@@ -3895,7 +3910,7 @@ public:
<< "\t\t{\n"
<< "\t\t if (vIn.x >= 0)\n"
<< "\t\t {\n"
- << "\t\t xo = (r + 1) / (2 * vIn.x);\n"
+ << "\t\t xo = (r + 1) / Zeps(2 * vIn.x);\n"
<< "\t\t ro = sqrt(SQR(vIn.x - xo) + SQR(vIn.y));\n"
<< "\t\t theta = atan2(1, ro);\n"
<< "\t\t a = fmod(" << in << " * theta + atan2(vIn.y, xo - vIn.x) + theta, 2 * theta) - theta;\n"
@@ -3928,7 +3943,7 @@ public:
<< "\n"
<< "\t\t if (x >= 0)\n"
<< "\t\t {\n"
- << "\t\t xo = (SQR(x) + SQR(y) + 1) / (2 * x);\n"
+ << "\t\t xo = (SQR(x) + SQR(y) + 1) / Zeps(2 * x);\n"
<< "\t\t ro = sqrt(SQR(x - xo) + SQR(y));\n"
<< "\t\t theta = atan2(1 , ro);\n"
<< "\t\t a = fmod(" << out << " * theta + atan2(y, xo - x) + theta, 2 * theta) - theta;\n"
@@ -3971,6 +3986,11 @@ public:
return ss.str();
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -4001,10 +4021,10 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
- T x = m_C1x + (SQR(m_C1r) * (helper.In.x - m_C1x)) / (SQR(helper.In.x - m_C1x) + SQR(helper.In.y - m_C1y));
- T y = m_C1y + (SQR(m_C1r) * (helper.In.y - m_C1y)) / (SQR(helper.In.x - m_C1x) + SQR(helper.In.y - m_C1y));
- helper.Out.x = m_C2x + (SQR(m_C2r) * (x - m_C2x)) / (SQR(x - m_C2x) + SQR(y - m_C2y));
- helper.Out.y = m_C2y + (SQR(m_C2r) * (y - m_C2y)) / (SQR(x - m_C2x) + SQR(y - m_C2y));
+ T x = m_C1x + (SQR(m_C1r) * (helper.In.x - m_C1x)) / Zeps(Sqr(helper.In.x - m_C1x) + Sqr(helper.In.y - m_C1y));
+ T y = m_C1y + (SQR(m_C1r) * (helper.In.y - m_C1y)) / Zeps(Sqr(helper.In.x - m_C1x) + Sqr(helper.In.y - m_C1y));
+ helper.Out.x = m_C2x + (SQR(m_C2r) * (x - m_C2x)) / Zeps(Sqr(x - m_C2x) + Sqr(y - m_C2y));
+ helper.Out.y = m_C2y + (SQR(m_C2r) * (y - m_C2y)) / Zeps(Sqr(x - m_C2x) + Sqr(y - m_C2y));
helper.Out.z = DefaultZ(helper);
}
@@ -4025,11 +4045,11 @@ public:
string c1d = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string c2d = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
- << "\t\treal_t x = " << c1x << " + (SQR(" << c1r << ") * (vIn.x - " << c1x << ")) / (SQR(vIn.x - " << c1x << ") + SQR(vIn.y - " << c1y << "));\n"
- << "\t\treal_t y = " << c1y << " + (SQR(" << c1r << ") * (vIn.y - " << c1y << ")) / (SQR(vIn.x - " << c1x << ") + SQR(vIn.y - " << c1y << "));\n"
+ << "\t\treal_t x = " << c1x << " + (SQR(" << c1r << ") * (vIn.x - " << c1x << ")) / Zeps(Sqr(vIn.x - " << c1x << ") + Sqr(vIn.y - " << c1y << "));\n"
+ << "\t\treal_t y = " << c1y << " + (SQR(" << c1r << ") * (vIn.y - " << c1y << ")) / Zeps(Sqr(vIn.x - " << c1x << ") + Sqr(vIn.y - " << c1y << "));\n"
<< "\n"
- << "\t\tvOut.x = " << c2x << " + (SQR(" << c2r << ") * (x - " << c2x << ")) / (SQR(x - " << c2x << ") + SQR(y - " << c2y << "));\n"
- << "\t\tvOut.y = " << c2y << " + (SQR(" << c2r << ") * (y - " << c2y << ")) / (SQR(x - " << c2x << ") + SQR(y - " << c2y << "));\n"
+ << "\t\tvOut.x = " << c2x << " + (SQR(" << c2r << ") * (x - " << c2x << ")) / Zeps(Sqr(x - " << c2x << ") + Sqr(y - " << c2y << "));\n"
+ << "\t\tvOut.y = " << c2y << " + (SQR(" << c2r << ") * (y - " << c2y << ")) / Zeps(Sqr(x - " << c2x << ") + Sqr(y - " << c2y << "));\n"
<< "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
@@ -4045,6 +4065,11 @@ public:
m_C2y = m_C2d * std::sin(fmod(m_C2a, T(M_PI)));
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Sqr", "Zeps" };
+ }
+
protected:
void Init()
{
@@ -4358,7 +4383,7 @@ public:
T ti = m_T3 * (3 * xsqr * helper.In.y - ycb) + m_T2 * 2 * helper.In.x * helper.In.y + m_T1 * helper.In.y;
T br = m_B3 * (xcb - 3 * helper.In.x * ysqr) + m_B2 * (xsqr - ysqr) + m_B1 * helper.In.x + m_Bc;
T bi = m_B3 * (3 * xsqr * helper.In.y - ycb) + m_B2 * 2 * helper.In.x * helper.In.y + m_B1 * helper.In.y;
- T r3den = 1 / (br * br + bi * bi);
+ T r3den = 1 / Zeps(br * br + bi * bi);
helper.Out.x = m_Weight * (tr * br + ti * bi) * r3den;
helper.Out.y = m_Weight * (ti * br - tr * bi) * r3den;
helper.Out.z = DefaultZ(helper);
@@ -4390,7 +4415,7 @@ public:
<< "\t\treal_t br = " << b3 << " * (xcb - 3 * vIn.x * ysqr) + " << b2 << " * (xsqr - ysqr) + " << b1 << " * vIn.x + " << bc << ";\n"
<< "\t\treal_t bi = " << b3 << " * (3 * xsqr * vIn.y - ycb) + " << b2 << " * 2 * vIn.x * vIn.y + " << b1 << " * vIn.y;\n"
<< "\n"
- << "\t\treal_t r3den = 1 / (br * br + bi * bi);\n"
+ << "\t\treal_t r3den = 1 / Zeps(br * br + bi * bi);\n"
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * (tr * br + ti * bi) * r3den;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * (ti * br - tr * bi) * r3den;\n"
@@ -4399,6 +4424,11 @@ public:
return ss.str();
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -4663,6 +4693,11 @@ public:
m_Vv = std::abs(m_Weight);
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -5192,7 +5227,7 @@ public:
T dot11 = SQR(m_C) + SQR(m_D);//v1 * v1.
T dot12 = m_C * helper.In.x + m_D * helper.In.y;//v1 * v2.
//Compute inverse denomiator.
- T invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
+ T invDenom = 1 / Zeps(dot00 * dot11 - dot01 * dot01);
//Now we can pull [u,v] as the barycentric coordinates of the point
//P in the triangle [A, B, C].
T u = (dot11 * dot02 - dot01 * dot12) * invDenom;
@@ -5221,7 +5256,7 @@ public:
<< "\t\treal_t dot02 = " << a << " * vIn.x + " << b << " * vIn.y;\n"
<< "\t\treal_t dot11 = SQR(" << c << ") + SQR(" << d << ");\n"
<< "\t\treal_t dot12 = " << c << " * vIn.x + " << d << " * vIn.y;\n"
- << "\t\treal_t invDenom = (real_t)(1.0) / (dot00 * dot11 - dot01 * dot01);\n"
+ << "\t\treal_t invDenom = (real_t)(1.0) / Zeps(dot00 * dot11 - dot01 * dot01);\n"
<< "\t\treal_t u = (dot11 * dot02 - dot01 * dot12) * invDenom;\n"
<< "\t\treal_t v = (dot00 * dot12 - dot01 * dot02) * invDenom;\n"
<< "\t\treal_t um = sqrt(SQR(u) + SQR(vIn.x)) * Sign(u);\n"
@@ -5236,7 +5271,7 @@ public:
virtual vector OpenCLGlobalFuncNames() const override
{
- return vector { "Sign" };
+ return vector { "Sign", "Zeps" };
}
protected:
diff --git a/Source/Ember/Variations03.h b/Source/Ember/Variations03.h
index bc90c5f..296a26d 100644
--- a/Source/Ember/Variations03.h
+++ b/Source/Ember/Variations03.h
@@ -20,9 +20,9 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
- T temp = 1 / Zeps(cos(helper.In.y)) + m_Effect * T(M_PI);
- helper.Out.x = m_Weight * (tanh(helper.In.x) * temp);
- helper.Out.y = m_Weight * (tanh(helper.In.y) * temp);
+ T temp = 1 / Zeps(std::cos(helper.In.y)) + m_Effect * T(M_PI);
+ helper.Out.x = m_Weight * (std::tanh(helper.In.x) * temp);
+ helper.Out.y = m_Weight * (std::tanh(helper.In.y) * temp);
helper.Out.z = DefaultZ(helper);
}
@@ -1111,7 +1111,7 @@ public:
T coeff = std::abs(helper.In.z);
if (coeff != 0 && m_Power != 1)
- coeff = std::exp(log(coeff) * m_Power);
+ coeff = std::exp(std::log(coeff) * m_Power);
helper.Out.x = m_Weight * (helper.m_TransX + helper.In.x * coeff);
helper.Out.y = m_Weight * (helper.m_TransY + helper.In.y * coeff);
@@ -2258,7 +2258,7 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
- T dx, dy, r = m_Weight / (helper.m_PrecalcSumSquares + EPS);
+ T dx, dy, r = m_Weight / Zeps(helper.m_PrecalcSumSquares);
int isXY = int(VarFuncs::LRint(helper.In.x * m_InvSize) + VarFuncs::LRint(helper.In.y * m_InvSize));
if (isXY & 1)
@@ -2289,7 +2289,7 @@ public:
string rand = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
string invSize = "parVars[" + ToUpper(m_Params[i++].Name()) + index;//Precalc.
ss << "\t{\n"
- << "\t\treal_t dx, dy, r = xform->m_VariationWeights[" << varIndex << "] / (precalcSumSquares + EPS);\n"
+ << "\t\treal_t dx, dy, r = xform->m_VariationWeights[" << varIndex << "] / Zeps(precalcSumSquares);\n"
<< "\t\tint isXY = LRint(vIn.x * " << invSize << ") + LRint(vIn.y * " << invSize << ");\n"
<< "\n"
<< "\t\tif (isXY & 1)\n"
@@ -2312,12 +2312,12 @@ public:
virtual vector OpenCLGlobalFuncNames() const override
{
- return vector { "LRint" };
+ return vector { "LRint", "Zeps" };
}
virtual void Precalc() override
{
- m_InvSize = 1 / (m_Size + EPS);
+ m_InvSize = 1 / Zeps(m_Size);
}
protected:
@@ -3468,8 +3468,8 @@ public:
sigma = alt * m_PiCn + fmod(sigma - m_CaCn, m_PiCn);
T temp = std::cosh(tau) - std::cos(sigma);
- helper.Out.x = m_Weight * sinh(tau) / temp;
- helper.Out.y = m_Weight * sin(sigma) / temp;
+ helper.Out.x = m_Weight * std::sinh(tau) / temp;
+ helper.Out.y = m_Weight * std::sin(sigma) / temp;
helper.Out.z = DefaultZ(helper);
}
@@ -3791,7 +3791,7 @@ public:
}
helper.Out.x = m_Weight * xmax * std::cos(nu);
- helper.Out.y = m_Weight * std::sqrt(xmax - 1) * std::sqrt(xmax + 1) * sin(nu);
+ helper.Out.y = m_Weight * std::sqrt(xmax - 1) * std::sqrt(xmax + 1) * std::sin(nu);
helper.Out.z = DefaultZ(helper);
}
diff --git a/Source/Ember/Variations04.h b/Source/Ember/Variations04.h
index 96dfecc..0e38016 100644
--- a/Source/Ember/Variations04.h
+++ b/Source/Ember/Variations04.h
@@ -592,8 +592,8 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
T d = Zeps(helper.m_PrecalcSumSquares);
- helper.Out.x = (m_Weight / d) * (tanh(d) * (2 * helper.In.x));
- helper.Out.y = (m_Weight / d) * (cos(d) * (2 * helper.In.y));
+ helper.Out.x = (m_Weight / d) * (std::tanh(d) * (2 * helper.In.x));
+ helper.Out.y = (m_Weight / d) * (std::cos(d) * (2 * helper.In.y));
helper.Out.z = DefaultZ(helper);
}
@@ -631,8 +631,8 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
T d = Zeps(helper.m_PrecalcSumSquares);
- helper.Out.x = (m_Weight / 2) * (tanh(d) * (2 * helper.In.x));
- helper.Out.y = (m_Weight / 2) * (cos(d) * (2 * helper.In.y));
+ helper.Out.x = (m_Weight / 2) * (std::tanh(d) * (2 * helper.In.x));
+ helper.Out.y = (m_Weight / 2) * (std::cos(d) * (2 * helper.In.y));
helper.Out.z = DefaultZ(helper);
}
@@ -3664,7 +3664,7 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
T absV = VarFuncs::Hypot(helper.In.y, helper.In.z);
- T ni = m_Weight / (helper.m_PrecalcSumSquares + SQR(helper.In.z));
+ T ni = m_Weight / Zeps(helper.m_PrecalcSumSquares + SQR(helper.In.z));
T s = std::sin(helper.In.x);
T c = std::cos(helper.In.x);
T sh = std::sinh(absV);
@@ -3681,7 +3681,7 @@ public:
intmax_t varIndex = IndexInXform();
ss << "\t{\n"
<< "\t\treal_t absV = Hypot(vIn.y, vIn.z);\n"
- << "\t\treal_t ni = xform->m_VariationWeights[" << varIndex << "] / (precalcSumSquares + SQR(vIn.z));\n"
+ << "\t\treal_t ni = xform->m_VariationWeights[" << varIndex << "] / Zeps(precalcSumSquares + SQR(vIn.z));\n"
<< "\t\treal_t s = sin(vIn.x);\n"
<< "\t\treal_t c = cos(vIn.x);\n"
<< "\t\treal_t sh = sinh(absV);\n"
@@ -3715,7 +3715,7 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
T absV = VarFuncs::Hypot(helper.In.y, helper.In.z);
- T ni = m_Weight / (helper.m_PrecalcSumSquares + SQR(helper.In.z));
+ T ni = m_Weight / Zeps(helper.m_PrecalcSumSquares + SQR(helper.In.z));
T s = std::sin(absV);
T c = std::cos(absV);
T sh = std::sinh(helper.In.x);
@@ -3732,7 +3732,7 @@ public:
intmax_t varIndex = IndexInXform();
ss << "\t{\n"
<< "\t\treal_t absV = Hypot(vIn.y, vIn.z);\n"
- << "\t\treal_t ni = xform->m_VariationWeights[" << varIndex << "] / (precalcSumSquares + SQR(vIn.z));\n"
+ << "\t\treal_t ni = xform->m_VariationWeights[" << varIndex << "] / Zeps(precalcSumSquares + SQR(vIn.z));\n"
<< "\t\treal_t s = sin(absV);\n"
<< "\t\treal_t c = cos(absV);\n"
<< "\t\treal_t sh = sinh(vIn.x);\n"
@@ -4731,7 +4731,7 @@ public:
if (r <= m_R1)
{
r *= m_R2 / m_R1;
- temp = atan2(helper.In.y, c1mx);
+ temp = std::atan2(helper.In.y, c1mx);
helper.Out.x = m_Weight * (r * std::cos(temp) - m_C2);
helper.Out.y = m_Weight * r * std::sin(temp);
}
@@ -4749,7 +4749,7 @@ public:
if (r <= m_R2)
{
r *= m_R1 / m_R2;
- temp = atan2(helper.In.y, c1mx);
+ temp = std::atan2(helper.In.y, c1mx);
helper.Out.x = m_Weight * (r * std::cos(temp) + m_C1);
helper.Out.y = m_Weight * r * std::sin(temp);
}
@@ -5060,10 +5060,10 @@ public:
T ymax = T(0.5) * (std::sqrt(tmp + y2) + std::sqrt(tmp - y2));
T a = helper.In.x / Zeps(xmax);
T b = VarFuncs::SafeSqrt(1 - SQR(a));
- helper.Out.x = m_Vx * atan2(a, b) * r;
+ helper.Out.x = m_Vx * std::atan2(a, b) * r;
a = helper.In.y / Zeps(ymax);
b = VarFuncs::SafeSqrt(1 - SQR(a));
- helper.Out.y = m_Vy * atan2(a, b) * r;
+ helper.Out.y = m_Vy * std::atan2(a, b) * r;
helper.Out.z = DefaultZ(helper);
}
diff --git a/Source/Ember/Variations05.h b/Source/Ember/Variations05.h
index 6ece9c4..97dee43 100644
--- a/Source/Ember/Variations05.h
+++ b/Source/Ember/Variations05.h
@@ -1086,8 +1086,8 @@ public:
T uu = SQR(helper.In.x);
T vv = SQR(helper.In.y);
T ww = SQR(helper.In.z);
- T atOmegaX = atan2(vv, ww);
- T atOmegaY = atan2(uu, ww);
+ T atOmegaX = std::atan2(vv, ww);
+ T atOmegaY = std::atan2(uu, ww);
T su = std::sin(helper.In.x);
T cu = std::cos(helper.In.x);
T sv = std::sin(helper.In.y);
@@ -1994,7 +1994,7 @@ public:
virtual void Func(IteratorHelper& helper, Point& outPoint, QTIsaac& rand) override
{
T t = helper.m_PrecalcSumSquares + SQR(helper.In.z);
- T r = 1 / (std::sqrt(t) * (t + m_InvWeight));
+ T r = 1 / Zeps(std::sqrt(t) * (t + m_InvWeight));
T z = helper.In.z == 0 ? helper.m_PrecalcAtanyx : helper.In.z;
helper.Out.x = helper.In.x * r;
helper.Out.y = helper.In.y * r;
@@ -2010,7 +2010,7 @@ public:
string invWeight = "parVars[" + ToUpper(m_Params[i++].Name()) + index;
ss << "\t{\n"
<< "\t\treal_t t = precalcSumSquares + SQR(vIn.z);\n"
- << "\t\treal_t r = 1 / (sqrt(t) * (t + " << invWeight << "));\n"
+ << "\t\treal_t r = 1 / Zeps(sqrt(t) * (t + " << invWeight << "));\n"
<< "\t\treal_t z = vIn.z == 0 ? precalcAtanyx : vIn.z;\n"
<< "\n"
<< "\t\tvOut.x = vIn.x * r;\n"
@@ -2025,6 +2025,11 @@ public:
m_InvWeight = 1 / Zeps(m_Weight);
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -2159,12 +2164,12 @@ public:
if (offsetX >= 0)
{
helper.Out.x += m_Weight * (offsetX * T(0.5) + roundX + m_X);
- helper.Out.y += m_Weight * (offsetY * T(0.5) + roundY + m_Y * offsetY / offsetX);
+ helper.Out.y += m_Weight * (offsetY * T(0.5) + roundY + m_Y * offsetY / Zeps(offsetX));
}
else
{
helper.Out.x += m_Weight * (offsetX * T(0.5) + roundX - m_Y);
- helper.Out.y += m_Weight * (offsetY * T(0.5) + roundY - m_Y * offsetY / offsetX);
+ helper.Out.y += m_Weight * (offsetY * T(0.5) + roundY - m_Y * offsetY / Zeps(offsetX));
}
}
else
@@ -2172,12 +2177,12 @@ public:
if (offsetY >= 0)
{
helper.Out.y += m_Weight * (offsetY * T(0.5) + roundY + m_Y);
- helper.Out.x += m_Weight * (offsetX * T(0.5) + roundX + offsetX / offsetY * m_Y);
+ helper.Out.x += m_Weight * (offsetX * T(0.5) + roundX + offsetX / Zeps(offsetY) * m_Y);
}
else
{
helper.Out.y += m_Weight * (offsetY * T(0.5) + roundY - m_Y);
- helper.Out.x += m_Weight * (offsetX * T(0.5) + roundX - offsetX / offsetY * m_X);
+ helper.Out.x += m_Weight * (offsetX * T(0.5) + roundX - offsetX / Zeps(offsetY) * m_X);
}
}
}
@@ -2219,12 +2224,12 @@ public:
<< "\t\t if (offsetX >= 0)\n"
<< "\t\t {\n"
<< "\t\t vOut.x += xform->m_VariationWeights[" << varIndex << "] * (offsetX * (real_t)(0.5) + roundX + " << x << ");\n"
- << "\t\t vOut.y += xform->m_VariationWeights[" << varIndex << "] * (offsetY * (real_t)(0.5) + roundY + " << y << " * offsetY / offsetX);\n"
+ << "\t\t vOut.y += xform->m_VariationWeights[" << varIndex << "] * (offsetY * (real_t)(0.5) + roundY + " << y << " * offsetY / Zeps(offsetX));\n"
<< "\t\t }\n"
<< "\t\t else\n"
<< "\t\t {\n"
<< "\t\t vOut.x += xform->m_VariationWeights[" << varIndex << "] * (offsetX * (real_t)(0.5) + roundX - " << y << ");\n"
- << "\t\t vOut.y += xform->m_VariationWeights[" << varIndex << "] * (offsetY * (real_t)(0.5) + roundY - " << y << " * offsetY / offsetX);\n"
+ << "\t\t vOut.y += xform->m_VariationWeights[" << varIndex << "] * (offsetY * (real_t)(0.5) + roundY - " << y << " * offsetY / Zeps(offsetX));\n"
<< "\t\t }\n"
<< "\t\t }\n"
<< "\t\t else\n"
@@ -2232,12 +2237,12 @@ public:
<< "\t\t if (offsetY >= 0)\n"
<< "\t\t {\n"
<< "\t\t vOut.y += xform->m_VariationWeights[" << varIndex << "] * (offsetY * (real_t)(0.5) + roundY + " << y << ");\n"
- << "\t\t vOut.x += xform->m_VariationWeights[" << varIndex << "] * (offsetX * (real_t)(0.5) + roundX + offsetX / offsetY * " << y << ");\n"
+ << "\t\t vOut.x += xform->m_VariationWeights[" << varIndex << "] * (offsetX * (real_t)(0.5) + roundX + offsetX / Zeps(offsetY) * " << y << ");\n"
<< "\t\t }\n"
<< "\t\t else\n"
<< "\t\t {\n"
<< "\t\t vOut.y += xform->m_VariationWeights[" << varIndex << "] * (offsetY * (real_t)(0.5) + roundY - " << y << ");\n"
- << "\t\t vOut.x += xform->m_VariationWeights[" << varIndex << "] * (offsetX * (real_t)(0.5) + roundX - offsetX / offsetY * " << x << ");\n"
+ << "\t\t vOut.x += xform->m_VariationWeights[" << varIndex << "] * (offsetX * (real_t)(0.5) + roundX - offsetX / Zeps(offsetY) * " << x << ");\n"
<< "\t\t }\n"
<< "\t\t }\n"
<< "\t\t}\n"
@@ -2249,6 +2254,11 @@ public:
return ss.str();
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
@@ -2360,9 +2370,9 @@ public:
default:
scale = Clamp(rs, 0, T(0.9)) + T(0.1);
denom = 1 / scale;
- helper.Out.x = m_Weight * Lerp(helper.In.x, floor(helper.In.x * denom) + scale * ax, m_MulX * rs) + m_MulX * std::pow(ax, m_BoxPow) * rs * denom;//m_BoxPow should be an integer value held in T,
- helper.Out.y = m_Weight * Lerp(helper.In.y, floor(helper.In.y * denom) + scale * ay, m_MulY * rs) + m_MulY * std::pow(ay, m_BoxPow) * rs * denom;//so std::abs() shouldn't be necessary.
- helper.Out.z = m_Weight * Lerp(helper.In.z, floor(helper.In.z * denom) + scale * az, m_MulZ * rs) + m_MulZ * std::pow(az, m_BoxPow) * rs * denom;
+ helper.Out.x = m_Weight * Lerp(helper.In.x, std::floor(helper.In.x * denom) + scale * ax, m_MulX * rs) + m_MulX * std::pow(ax, m_BoxPow) * rs * denom;//m_BoxPow should be an integer value held in T,
+ helper.Out.y = m_Weight * Lerp(helper.In.y, std::floor(helper.In.y * denom) + scale * ay, m_MulY * rs) + m_MulY * std::pow(ay, m_BoxPow) * rs * denom;//so std::abs() shouldn't be necessary.
+ helper.Out.z = m_Weight * Lerp(helper.In.z, std::floor(helper.In.z * denom) + scale * az, m_MulZ * rs) + m_MulZ * std::pow(az, m_BoxPow) * rs * denom;
break;
}
}
@@ -4131,7 +4141,7 @@ public:
while (++n < 6)
{
if ((m_P[n].y <= i.y && i.y < m_P[j].y) || (m_P[j].y <= i.y && i.y < m_P[n].y))
- if (i.x < (m_P[j].x - m_P[n].x) * (i.y - m_P[n].y) / (m_P[j].y - m_P[n].y) + m_P[n].x)
+ if (i.x < (m_P[j].x - m_P[n].x) * (i.y - m_P[n].y) / Zeps(m_P[j].y - m_P[n].y) + m_P[n].x)
c ^= 1;
j = n;
@@ -4182,7 +4192,7 @@ public:
<< "\t\t int ynoff = " << pyStartIndex << " + n;\n"
<< "\n"
<< "\t\t if ((parVars[ynoff] <= i.y && i.y < parVars[yjoff]) || (parVars[yjoff] <= i.y && i.y < parVars[ynoff]))\n"
- << "\t\t if (i.x < (parVars[xjoff] - parVars[xnoff]) * (i.y - parVars[ynoff]) / (parVars[yjoff] - parVars[ynoff]) + parVars[xnoff])\n"
+ << "\t\t if (i.x < (parVars[xjoff] - parVars[xnoff]) * (i.y - parVars[ynoff]) / Zeps(parVars[yjoff] - parVars[ynoff]) + parVars[xnoff])\n"
<< "\t\t c ^= 1;\n"
<< "\n"
<< "\t\t j = n;\n"
@@ -4226,6 +4236,11 @@ public:
m_P[5].y = T(0.0000000000000000000000000000000) * m_ScaleY;
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
diff --git a/Source/Ember/Variations06.h b/Source/Ember/Variations06.h
index df0e745..ebc576e 100644
--- a/Source/Ember/Variations06.h
+++ b/Source/Ember/Variations06.h
@@ -783,9 +783,9 @@ public:
if (m_AdjustToLinear == 1)
{
if (int(m_NumEdges) % 4 == 0)
- m_AdjustedWeight = m_Weight / (std::sqrt(2 - 2 * std::cos(m_MidAngle * (m_NumEdges / 2 - 1))) / 2);
+ m_AdjustedWeight = m_Weight / Zeps(std::sqrt(2 - 2 * std::cos(m_MidAngle * (m_NumEdges / 2 - 1))) / 2);
else
- m_AdjustedWeight = m_Weight / (std::sqrt(2 - 2 * std::cos(m_MidAngle * std::floor((m_NumEdges / 2)))) / 2);
+ m_AdjustedWeight = m_Weight / Zeps(std::sqrt(2 - 2 * std::cos(m_MidAngle * std::floor((m_NumEdges / 2)))) / 2);
}
else
m_AdjustedWeight = m_Weight;
@@ -1515,7 +1515,7 @@ public:
yTmp = m_Top + rand.Frand01() * m_YInt2;
xTmp = m_Right - pow(rand.Frand01(), m_DirectBlur) * m_RatioBlur * m_MinInt2;
}
- while ((yTmp - m_Y0c) / (xTmp - m_X0c) < -1);
+ while ((yTmp - m_Y0c) / Zeps(xTmp - m_X0c) < -1);
if (secTmp < m_SetProbH)
xTmp = m_Left + m_Right - xTmp;
@@ -1529,7 +1529,7 @@ public:
{
xTmp = m_Right - rand.Frand01() * m_XInt2;
yTmp = m_Top + std::pow(rand.Frand01(), m_DirectBlur) * m_RatioBlur * m_MinInt2;
- gradTmp = (yTmp - m_Y0c) / (xTmp - m_X0c);
+ gradTmp = (yTmp - m_Y0c) / Zeps(xTmp - m_X0c);
}
while ((gradTmp <= 0) && (gradTmp > -1));
@@ -1614,7 +1614,7 @@ public:
<< "\t\t {\n"
<< "\t\t yTmp = " << top << " + MwcNext01(mwc) * " << yInt2 << ";\n"
<< "\t\t xTmp = " << right << " - pow(MwcNext01(mwc), " << directBlur << ") * " << ratioBlur << " * " << minInt2 << ";\n"
- << "\t\t } while ((yTmp - " << y0c << ") / (xTmp - " << x0c << ") < -1);\n"
+ << "\t\t } while ((yTmp - " << y0c << ") / Zeps(xTmp - " << x0c << ") < -1);\n"
<< "\n"
<< "\t\t if (secTmp < " << setProbH << ")\n"
<< "\t\t xTmp = " << left << " + " << right << " - xTmp;\n"
@@ -1628,7 +1628,7 @@ public:
<< "\t\t {\n"
<< "\t\t xTmp = " << right << " - MwcNext01(mwc) * " << xInt2 << ";\n"
<< "\t\t yTmp = " << top << " + pow(MwcNext01(mwc), " << directBlur << ") * " << ratioBlur << " * " << minInt2 << ";\n"
- << "\t\t gradTmp = (yTmp - " << y0c << ") / (xTmp - " << x0c << ");\n"
+ << "\t\t gradTmp = (yTmp - " << y0c << ") / Zeps(xTmp - " << x0c << ");\n"
<< "\t\t } while ((gradTmp <= 0) && (gradTmp > -1));\n"
<< "\n"
<< "\t\t if (secTmp > " << setProbH << ")\n"
@@ -1737,6 +1737,11 @@ public:
}
}
+ virtual vector OpenCLGlobalFuncNames() const override
+ {
+ return vector { "Zeps" };
+ }
+
protected:
void Init()
{
diff --git a/Source/Ember/Variations07.h b/Source/Ember/Variations07.h
index 221aafe..0799720 100644
--- a/Source/Ember/Variations07.h
+++ b/Source/Ember/Variations07.h
@@ -957,7 +957,7 @@ template
class CircleSplitVariation : public ParametricVariation
{
public:
- CircleSplitVariation(T weight = 1.0) : ParametricVariation("circlesplit", eVariationId::VAR_CIRCLESPLIT, weight, true, true)
+ CircleSplitVariation(T weight = 1.0) : ParametricVariation("circlesplit", eVariationId::VAR_CIRCLESPLIT, weight, true, true, false, false, true)
{
Init();
}
@@ -975,7 +975,7 @@ public:
}
else
{
- T a = std::atan2(helper.In.y, helper.In.x);
+ T a = helper.m_PrecalcAtanyx;
T len = helper.m_PrecalcSqrtSumSquares + m_Split;
x1 = std::cos(a) * len;
y1 = std::sin(a) * len;
@@ -983,6 +983,7 @@ public:
helper.Out.x = m_Weight * x1;
helper.Out.y = m_Weight * y1;
+ helper.Out.z = DefaultZ(helper);
}
virtual string OpenCLString() const override
@@ -1003,13 +1004,14 @@ public:
<< "\t\t}\n"
<< "\t\telse\n"
<< "\t\t{\n"
- << "\t\t\treal_t a = (real_t)atan2(vIn.y, vIn.x);\n"
+ << "\t\t\treal_t a = precalcAtanyx;\n"
<< "\t\t\treal_t len = precalcSqrtSumSquares + " << cs_split << ";\n"
<< "\t\t\tx1 = cos(a) * len;\n"
<< "\t\t\ty1 = sin(a) * len;\n"
<< "\t\t}"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * x1;\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * y1;\n"
+ << "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
}
@@ -1045,6 +1047,7 @@ public:
{
helper.Out.x = m_Weight * (helper.In.x / Zeps(std::sqrt(SQR(helper.In.x) + 1)));
helper.Out.y = m_Weight * helper.In.y;
+ helper.Out.z = DefaultZ(helper);
}
virtual string OpenCLString() const override
@@ -1055,6 +1058,7 @@ public:
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * (vIn.x / Zeps(sqrt(SQR(vIn.x) + (real_t)1.0)));\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vIn.y;\n"
+ << "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
}
@@ -1086,6 +1090,7 @@ public:
T temp = Round(std::log(rand.Frand01()) * (rand.Rand() & 1 ? m_Spread : -m_Spread));
helper.Out.x = m_Weight * (helper.In.x + temp);
helper.Out.y = m_Weight * helper.In.y;
+ helper.Out.z = DefaultZ(helper);
}
virtual string OpenCLString() const override
@@ -1100,6 +1105,7 @@ public:
<< "\n"
<< "\t\tvOut.x = xform->m_VariationWeights[" << varIndex << "] * (vIn.x + temp);\n"
<< "\t\tvOut.y = xform->m_VariationWeights[" << varIndex << "] * vIn.y;\n"
+ << "\t\tvOut.z = " << DefaultZCl()
<< "\t}\n";
return ss.str();
}
@@ -1341,7 +1347,7 @@ public:
m_FinalExponent = m_Exponent > T(2) ? T(2) : (m_Exponent < T(0.001) ? T(0.001) : m_Exponent);
m_OneOverEx = T(1) / m_FinalExponent;
m_Width = m_ArcWidth > T(1) ? T(1) : (m_ArcWidth < T(0.001) ? T(0.001) : m_ArcWidth);
- m_Seed2 = std::sqrt(m_Seed * T(1.5)) / (m_Seed * T(0.5)) * T(0.25);
+ m_Seed2 = std::sqrt(m_Seed * T(1.5)) / Zeps(m_Seed * T(0.5)) * T(0.25);
m_Rmax = T(0.5) * (std::pow(T(2), m_OneOverEx) - T(1)) * m_Width;
m_Scale = T(1) / m_Weight;
}
diff --git a/Source/Ember/Xform.h b/Source/Ember/Xform.h
index 51e2bfc..91ba577 100644
--- a/Source/Ember/Xform.h
+++ b/Source/Ember/Xform.h
@@ -866,10 +866,10 @@ public:
}
if (m_NeedPrecalcAtanXY)
- helper.m_PrecalcAtanxy = atan2(helper.m_TransX, helper.m_TransY);
+ helper.m_PrecalcAtanxy = std::atan2(helper.m_TransX, helper.m_TransY);
if (m_NeedPrecalcAtanYX)
- helper.m_PrecalcAtanyx = atan2(helper.m_TransY, helper.m_TransX);
+ helper.m_PrecalcAtanyx = std::atan2(helper.m_TransY, helper.m_TransX);
}
///
diff --git a/Source/EmberCL/DEOpenCLKernelCreator.cpp b/Source/EmberCL/DEOpenCLKernelCreator.cpp
index f794617..292bc21 100644
--- a/Source/EmberCL/DEOpenCLKernelCreator.cpp
+++ b/Source/EmberCL/DEOpenCLKernelCreator.cpp
@@ -128,7 +128,7 @@ double DEOpenCLKernelCreator::SolveMaxDERad(double desiredFilterSize, double ss)
return desiredFilterSize;
//The final size doesn't fit, so scale the original down until it fits.
- return floor((MaxDEFilterSize() - (ss - 1.0)) / ss);
+ return std::floor((MaxDEFilterSize() - (ss - 1.0)) / ss);
}
///
@@ -139,7 +139,7 @@ double DEOpenCLKernelCreator::SolveMaxDERad(double desiredFilterSize, double ss)
/// The maximum filter box size allowed
uint DEOpenCLKernelCreator::SolveMaxBoxSize(uint localMem)
{
- return uint(floor(std::sqrt(floor(localMem / 16.0))));//Divide by 16 because each element is float4.
+ return uint(std::floor(std::sqrt(Floor(localMem / 16.0))));//Divide by 16 because each element is float4.
}
///
diff --git a/Source/EmberCL/FunctionMapper.cpp b/Source/EmberCL/FunctionMapper.cpp
index 500977f..a69fd3a 100644
--- a/Source/EmberCL/FunctionMapper.cpp
+++ b/Source/EmberCL/FunctionMapper.cpp
@@ -389,4 +389,14 @@ const string* FunctionMapper::GetGlobalFunc(const string& func)
else
return nullptr;
}
+
+///
+/// Get a copy of the function map.
+/// This is useful only for debugging/testing.
+///
+/// A copy of the function map
+const std::unordered_map FunctionMapper::GetGlobalMapCopy()
+{
+ return s_GlobalMap;
+}
}
diff --git a/Source/EmberCL/FunctionMapper.h b/Source/EmberCL/FunctionMapper.h
index 487d40e..de386a4 100644
--- a/Source/EmberCL/FunctionMapper.h
+++ b/Source/EmberCL/FunctionMapper.h
@@ -14,6 +14,7 @@ class EMBERCL_API FunctionMapper
public:
FunctionMapper();
static const string* GetGlobalFunc(const string& func);
+ static const std::unordered_map GetGlobalMapCopy();
private:
static std::unordered_map s_GlobalMap;
diff --git a/Source/EmberTester/EmberTester.cpp b/Source/EmberTester/EmberTester.cpp
index 670c6c4..d23b75d 100644
--- a/Source/EmberTester/EmberTester.cpp
+++ b/Source/EmberTester/EmberTester.cpp
@@ -1035,19 +1035,36 @@ bool TestConstants()
return success;
}
+void TestFuncs()
+{
+ //auto vlf(VariationList::Instance());
+ //vector stringVec;
+ //stringVec.push_back("/ (");
+ ////stringVec.push_back("log(");
+ //for (size_t i = 0; i < vlf->Size(); i++)
+ //{
+ // auto var = vlf->GetVariation(i);
+ // if (SearchVar(var, stringVec, false))
+ // {
+ // cout << var->Name() << endl;
+ // }
+ //}
+}
+
bool TestGlobalFuncs()
{
bool success = true;
auto vlf(VariationList::Instance());
vector funcs;
FunctionMapper mapper;
+ auto funcmap = mapper.GetGlobalMapCopy();
for (size_t i = 0; i < vlf->Size(); i++)
{
auto var = vlf->GetVariation(i);
funcs = var->OpenCLGlobalFuncNames();
- for (auto& func : funcs)
+ for (auto& func : funcs)//Test if the functions the variation says it requires actually exist.
{
if (!mapper.GetGlobalFunc(func))
{
@@ -1059,6 +1076,23 @@ bool TestGlobalFuncs()
//cout << "Variation " << var->Name() << " used valid global funcion " << func << endl;
}
}
+
+ auto str = var->OpenCLString();
+ auto vec = var->OpenCLGlobalFuncNames();
+
+ for (auto& func : funcmap)//Test if the functions the variation uses are actually included in those it says are required.
+ {
+ if (Find(str, func.first + "("))
+ {
+ if (!Contains(vec, func.first))
+ {
+ cout << "Variation " << var->Name() << " used global funcion " << func.first << ", but it's not found in its global func name vector: " << endl;
+
+ for (auto& v : vec)
+ cout << v << endl;
+ }
+ }
+ }
}
return success;
@@ -1221,11 +1255,11 @@ void TestVarTime()
helper.m_Color.x = p.m_ColorX = rand.Frand01();
p.m_Opacity = rand.Frand01();
helper.m_PrecalcSumSquares = SQR(helper.m_TransX) + SQR(helper.m_TransY);
- helper.m_PrecalcSqrtSumSquares = sqrt(helper.m_PrecalcSumSquares);
+ helper.m_PrecalcSqrtSumSquares = std::sqrt(helper.m_PrecalcSumSquares);
helper.m_PrecalcSina = helper.m_TransX / helper.m_PrecalcSqrtSumSquares;
helper.m_PrecalcCosa = helper.m_TransY / helper.m_PrecalcSqrtSumSquares;
- helper.m_PrecalcAtanxy = atan2(helper.m_TransX, helper.m_TransY);
- helper.m_PrecalcAtanyx = atan2(helper.m_TransY, helper.m_TransX);
+ helper.m_PrecalcAtanxy = std::atan2(helper.m_TransX, helper.m_TransY);
+ helper.m_PrecalcAtanyx = std::atan2(helper.m_TransY, helper.m_TransX);
var->Random(rand);
t.Tic();
var->Func(helper, p, rand);
@@ -1288,8 +1322,6 @@ void TestOperations()
{
cout << "Variation " << varVec[i]->Name() << " contained MwcNext(mwc) %. Use MwcNextRange() instead." << endl;
}
-
- stringVec.clear();
}
template
@@ -1347,11 +1379,11 @@ void TestVarsSimilar()
p.m_Opacity = rand.Frand01();
pComp = p;
helper.m_PrecalcSumSquares = SQR(helper.m_TransX) + SQR(helper.m_TransY);
- helper.m_PrecalcSqrtSumSquares = sqrt(helper.m_PrecalcSumSquares);
+ helper.m_PrecalcSqrtSumSquares = std::sqrt(helper.m_PrecalcSumSquares);
helper.m_PrecalcSina = helper.m_TransX / helper.m_PrecalcSqrtSumSquares;
helper.m_PrecalcCosa = helper.m_TransY / helper.m_PrecalcSqrtSumSquares;
- helper.m_PrecalcAtanxy = atan2(helper.m_TransX, helper.m_TransY);
- helper.m_PrecalcAtanyx = atan2(helper.m_TransY, helper.m_TransX);
+ helper.m_PrecalcAtanxy = std::atan2(helper.m_TransX, helper.m_TransY);
+ helper.m_PrecalcAtanyx = std::atan2(helper.m_TransY, helper.m_TransX);
if (parVar)
{
@@ -1641,10 +1673,10 @@ void TestRandomAccess(size_t vsize, size_t ipp, bool cache)
v4T v4(rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11());
int index = rand.Rand((ISAAC_INT)vsize);
v4T v42 = vdata[index];
- v4.x = log(v4.x);
- v4.y = sqrt(v4.y);
- v4.z = sin(v4.z);
- v4.w = cos(v4.w);
+ v4.x = std::log(v4.x);
+ v4.y = std::sqrt(v4.y);
+ v4.z = std::sin(v4.z);
+ v4.w = std::cos(v4.w);
v4 += T(1.234);
v4 *= T(55.55);
v4 /= T(0.0045);
@@ -1657,10 +1689,10 @@ void TestRandomAccess(size_t vsize, size_t ipp, bool cache)
{
v4T v4(rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11());
int index = rand.Rand((ISAAC_INT)vsize);
- v4.x = log(v4.x);
- v4.y = sqrt(v4.y);
- v4.z = sin(v4.z);
- v4.w = cos(v4.w);
+ v4.x = std::log(v4.x);
+ v4.y = std::sqrt(v4.y);
+ v4.z = std::sin(v4.z);
+ v4.w = std::cos(v4.w);
v4 += T(1.234);
v4 *= T(55.55);
v4 /= T(0.0045);
@@ -1673,7 +1705,7 @@ template
void TestCross(T x, T y, T weight)
{
T s = x * x - y * y;
- T r = weight * sqrt(1 / (s * s + EPS));
+ T r = weight * std::sqrt(1 / (s * s + EPS));
T outX = x * r;
T outY = y * r;
cout << "First way, outX, outY == " << outX << ", " << outY << endl;
@@ -1931,9 +1963,8 @@ int _tmain(int argc, _TCHAR* argv[])
vector> dv;
list> fl;
list> dl;
- _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
- _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
- /* string line = "title=\"cj_aerie\" smooth=no", delim = " =\"";
+ /* TestFuncs();
+ string line = "title=\"cj_aerie\" smooth=no", delim = " =\"";
auto vec = Split(line, delim, true);
for (auto& s : vec) cout << s << endl;
@@ -1958,9 +1989,9 @@ int _tmain(int argc, _TCHAR* argv[])
TestRotate();
return 1;
*/
- MakeTestAllVarsRegPrePostComboFile("testallvarsout.flame");
- return 0;
- /*
+ //MakeTestAllVarsRegPrePostComboFile("testallvarsout.flame");
+ /* return 0;
+
TestThreadedKernel();
diff --git a/Source/Fractorium/FinalRenderEmberController.cpp b/Source/Fractorium/FinalRenderEmberController.cpp
index 4d29c01..61bf4ae 100644
--- a/Source/Fractorium/FinalRenderEmberController.cpp
+++ b/Source/Fractorium/FinalRenderEmberController.cpp
@@ -481,8 +481,8 @@ int FinalRenderEmberController::ProgressFunc(Ember& ember, void* foo, doub
{
static int count = 0;
size_t strip = *(reinterpret_cast(FirstOrDefaultRenderer()->m_ProgressParameter));
- double fracPerStrip = ceil(100.0 / m_GuiState.m_Strips);
- double stripsfrac = ceil(fracPerStrip * strip) + ceil(fraction / m_GuiState.m_Strips);
+ double fracPerStrip = std::ceil(100.0 / m_GuiState.m_Strips);
+ double stripsfrac = std::ceil(fracPerStrip * strip) + std::ceil(fraction / m_GuiState.m_Strips);
int intFract = int(stripsfrac);
if (stage == 0)
diff --git a/Source/Fractorium/FractoriumPalette.cpp b/Source/Fractorium/FractoriumPalette.cpp
index 6ba80dc..495d6e2 100644
--- a/Source/Fractorium/FractoriumPalette.cpp
+++ b/Source/Fractorium/FractoriumPalette.cpp
@@ -319,6 +319,7 @@ void FractoriumEmberController::PaletteEditorButtonClicked()
{
size_t i = 0;
auto ed = m_Fractorium->m_PaletteEditor;
+ Palette edPal;
Palette prevPal = m_TempPalette;
ed->SetPalette(m_TempPalette);
map colorIndices;
@@ -327,28 +328,27 @@ void FractoriumEmberController::PaletteEditorButtonClicked()
colorIndices[i++] = xform->m_ColorX;
ed->SetColorIndices(colorIndices);
+ ed->SetPaletteFile(m_CurrentPaletteFilePath);
if (ed->exec() == QDialog::Accepted)
{
if (!m_Fractorium->PaletteChanged())//If the clicked ok, but never synced, set the palette now.
- SetBasePaletteAndAdjust(ed->GetPalette(int(256)));
+ {
+ edPal = ed->GetPalette(int(256));
+ SetBasePaletteAndAdjust(edPal);
+
+ if (edPal.m_Filename.get() && !edPal.m_Filename->empty())
+ m_Fractorium->SetPaletteFileComboIndex(*edPal.m_Filename);
+ }
}
else if (m_Fractorium->PaletteChanged())//They clicked cancel, but synced at least once, restore the previous palette.
{
SetBasePaletteAndAdjust(prevPal);
}
- //If the palette was modifiable, and any palette was changed at least once
- if (m_Fractorium->m_PaletteFileChanged && m_PaletteList->IsModifiable(m_CurrentPaletteFilePath))
- {
- if (!::FillPaletteTable(m_CurrentPaletteFilePath, m_Fractorium->ui.PaletteListTable, m_PaletteList))
- {
- vector errors = m_PaletteList->ErrorReport();
- m_Fractorium->ErrorReportToQTextEdit(errors, m_Fractorium->ui.InfoFileOpeningTextEdit);
- m_Fractorium->ShowCritical("Palette Read Error", "Could not re-load modified palette file, all images will be black. See info tab for details.");
- m_PaletteList->ClearErrorReport();
- }
- }
+ //Whether the current palette file was changed or not, if it's modifiable then reload it just to be safe.
+ if (m_PaletteList->IsModifiable(m_CurrentPaletteFilePath))
+ m_Fractorium->OnPaletteFilenameComboChanged(QString::fromStdString(m_CurrentPaletteFilePath));
}
///
diff --git a/Source/Fractorium/FractoriumXformsAffine.cpp b/Source/Fractorium/FractoriumXformsAffine.cpp
index f49e516..4e69b42 100644
--- a/Source/Fractorium/FractoriumXformsAffine.cpp
+++ b/Source/Fractorium/FractoriumXformsAffine.cpp
@@ -259,21 +259,21 @@ void FractoriumEmberController::AffineSetHelper(double d, int index, bool pre
{
case 0:
case 3:
- affine.A(cos(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
- affine.D(sin(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
+ affine.A(std::cos(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
+ affine.D(std::sin(spinners[0]->value() * DEG_2_RAD) * spinners[3]->value());
break;
case 1:
case 4:
- affine.B(cos(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
- affine.E(sin(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
+ affine.B(std::cos(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
+ affine.E(std::sin(spinners[1]->value() * DEG_2_RAD) * spinners[4]->value());
break;
case 2:
case 5:
default:
- affine.C(cos(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
- affine.F(sin(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
+ affine.C(std::cos(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
+ affine.F(std::sin(spinners[2]->value() * DEG_2_RAD) * spinners[5]->value());
break;
}
}
@@ -623,9 +623,9 @@ void FractoriumEmberController::FillAffineWithXform(Xform* xform, bool pre
if (m_Fractorium->ui.PolarAffineCheckBox->isChecked())
{
- spinners[0]->SetValueStealth(RAD_2_DEG * atan2(affine.D(), affine.A()));
- spinners[1]->SetValueStealth(RAD_2_DEG * atan2(affine.E(), affine.B()));
- spinners[2]->SetValueStealth(RAD_2_DEG * atan2(affine.F(), affine.C()));
+ spinners[0]->SetValueStealth(RAD_2_DEG * std::atan2(affine.D(), affine.A()));
+ spinners[1]->SetValueStealth(RAD_2_DEG * std::atan2(affine.E(), affine.B()));
+ spinners[2]->SetValueStealth(RAD_2_DEG * std::atan2(affine.F(), affine.C()));
spinners[3]->SetValueStealth(VarFuncs::Hypot(affine.D(), affine.A()));
spinners[4]->SetValueStealth(VarFuncs::Hypot(affine.E(), affine.B()));
spinners[5]->SetValueStealth(VarFuncs::Hypot(affine.F(), affine.C()));
diff --git a/Source/Fractorium/GLWidget.cpp b/Source/Fractorium/GLWidget.cpp
index 43d331a..1e070a4 100644
--- a/Source/Fractorium/GLWidget.cpp
+++ b/Source/Fractorium/GLWidget.cpp
@@ -860,10 +860,10 @@ void GLEmberController::DrawGrid()
double scale = m_FractoriumEmberController->AffineScaleCurrentToLocked();
float unitX = (std::abs(renderer->UpperRightX(false) - renderer->LowerLeftX(false)) / 2.0f) / scale;
float unitY = (std::abs(renderer->UpperRightY(false) - renderer->LowerLeftY(false)) / 2.0f) / scale;
- float xLow = floor(-unitX);
- float xHigh = ceil(unitX);
- float yLow = floor(-unitY);
- float yHigh = ceil(unitY);
+ float xLow = std::floor(-unitX);
+ float xHigh = std::ceil(unitX);
+ float yLow = std::floor(-unitY);
+ float yHigh = std::ceil(unitY);
float alpha = 0.25f;
Affine2D temp;
m4T mat = (temp * scale).ToMat4RowMajor();
diff --git a/Source/Fractorium/PaletteEditor.ui b/Source/Fractorium/PaletteEditor.ui
index 0d2e06e..bc27a3a 100644
--- a/Source/Fractorium/PaletteEditor.ui
+++ b/Source/Fractorium/PaletteEditor.ui
@@ -70,8 +70,11 @@
16777215
-
-
+
+
+ true
+
+
QFrame::Panel
diff --git a/Source/Fractorium/PaletteEditor/ColorTriangle.cpp b/Source/Fractorium/PaletteEditor/ColorTriangle.cpp
index 5607d71..51c23fd 100644
--- a/Source/Fractorium/PaletteEditor/ColorTriangle.cpp
+++ b/Source/Fractorium/PaletteEditor/ColorTriangle.cpp
@@ -105,18 +105,18 @@ ColorTriangle::ColorTriangle(QWidget* parent)
void ColorTriangle::Polish()
{
outerRadius = CalcOuterRadius();//Matt
- penWidth = (int) floor(outerRadius / 50.0);
- ellipseSize = (int) floor(outerRadius / 12.5);
+ penWidth = (int)Floor(outerRadius / 50.0);
+ ellipseSize = (int) Floor(outerRadius / 12.5);
double cx = (double) contentsRect().center().x();
double cy = (double) contentsRect().center().y();
- pa = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 5.0))));
- pb = QPointF(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(b) * (outerRadius - (outerRadius / 5.0))));
- pc = QPointF(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(c) * (outerRadius - (outerRadius / 5.0))));
- pd = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 10.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 10.0))));
+ pa = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 5.0))));
+ pb = QPointF(cx + (std::cos(b) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(b) * (outerRadius - (outerRadius / 5.0))));
+ pc = QPointF(cx + (std::cos(c) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(c) * (outerRadius - (outerRadius / 5.0))));
+ pd = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 10.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 10.0))));
// Find the current position of the selector
selectorPos = PointFromColor(curColor);
update();
@@ -182,7 +182,7 @@ void ColorTriangle::GenBackground()
for (int f = 0; f <= 5760; f += 20)
{
- int value = int((0.5 + cos(((f - 1800) / 5760.0) * TWOPI) / 2) * 255.0);
+ int value = int((0.5 + std::cos(((f - 1800) / 5760.0) * TWOPI) / 2) * 255.0);
color.setHsv(int((f / 5760.0) * 360.0), 128 + (255 - value) / 2, 255 - (255 - value) / 4);
p.setPen(QPen(color, penThickness));
p.drawArc(innerRadiusRect, 1440 - f, 20);
@@ -237,14 +237,14 @@ void ColorTriangle::mouseMoveEvent(QMouseEvent* e)
double cx = (double) contentsRect().center().x();
double cy = (double) contentsRect().center().y();
- pa = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 5.0))));
- pb = QPointF(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(b) * (outerRadius - (outerRadius / 5.0))));
- pc = QPointF(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(c) * (outerRadius - (outerRadius / 5.0))));
- pd = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 10.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 10.0))));
+ pa = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 5.0))));
+ pb = QPointF(cx + (std::cos(b) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(b) * (outerRadius - (outerRadius / 5.0))));
+ pc = QPointF(cx + (std::cos(c) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(c) * (outerRadius - (outerRadius / 5.0))));
+ pd = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 10.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 10.0))));
selectorPos = PointFromColor(curColor);
}
else
@@ -331,14 +331,14 @@ void ColorTriangle::mousePressEvent(QMouseEvent* e)
double cx = (double) contentsRect().center().x();
double cy = (double) contentsRect().center().y();
- pa = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 5.0))));
- pb = QPointF(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(b) * (outerRadius - (outerRadius / 5.0))));
- pc = QPointF(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(c) * (outerRadius - (outerRadius / 5.0))));
- pd = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 10.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 10.0))));
+ pa = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 5.0))));
+ pb = QPointF(cx + (std::cos(b) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(b) * (outerRadius - (outerRadius / 5.0))));
+ pc = QPointF(cx + (std::cos(c) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(c) * (outerRadius - (outerRadius / 5.0))));
+ pd = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 10.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 10.0))));
selectorPos = PointFromColor(curColor);
emit ColorChanged(curColor);
}
@@ -477,18 +477,18 @@ void ColorTriangle::keyPressEvent(QKeyEvent* e)
void ColorTriangle::resizeEvent(QResizeEvent*)
{
outerRadius = CalcOuterRadius();//Matt
- penWidth = (int) floor(outerRadius / 50.0);
- ellipseSize = (int) floor(outerRadius / 12.5);
+ penWidth = (int)Floor(outerRadius / 50.0);
+ ellipseSize = (int)Floor(outerRadius / 12.5);
double cx = (double) contentsRect().center().x();
double cy = (double) contentsRect().center().y();
- pa = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 5.0))));
- pb = QPointF(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(b) * (outerRadius - (outerRadius / 5.0))));
- pc = QPointF(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(c) * (outerRadius - (outerRadius / 5.0))));
- pd = QPointF(cx + (cos(a) * (outerRadius - (outerRadius / 10.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 10.0))));
+ pa = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 5.0))));
+ pb = QPointF(cx + (std::cos(b) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(b) * (outerRadius - (outerRadius / 5.0))));
+ pc = QPointF(cx + (std::cos(c) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(c) * (outerRadius - (outerRadius / 5.0))));
+ pd = QPointF(cx + (std::cos(a) * (outerRadius - (outerRadius / 10.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 10.0))));
// Find the current position of the selector
selectorPos = PointFromColor(curColor);
mustGenerateBackground = true;
@@ -614,10 +614,10 @@ void ColorTriangle::DrawTrigon(QImage* buf, const QPointF& pa,
QVarLengthArray rightColors;
QVarLengthArray leftX;
QVarLengthArray rightX;
- leftColors.resize(int(floor(p3->point.y() + 1)));
- rightColors.resize(int(floor(p3->point.y() + 1)));
- leftX.resize(int(floor(p3->point.y() + 1)));
- rightX.resize(int(floor(p3->point.y() + 1)));
+ leftColors.resize(int(Floor(p3->point.y() + 1)));
+ rightColors.resize(int(Floor(p3->point.y() + 1)));
+ leftX.resize(int(Floor(p3->point.y() + 1)));
+ rightX.resize(int(Floor(p3->point.y() + 1)));
// Scan longy - find all left and right colors and X-values for
// the tallest edge (p1-p3).
DoubleColor source;
@@ -634,8 +634,8 @@ void ColorTriangle::DrawTrigon(QImage* buf, const QPointF& pa,
r = source.r;
g = source.g;
b = source.b;
- y1 = (int) floor(p1->point.y());
- y2 = (int) floor(p3->point.y());
+ y1 = (int)Floor(p1->point.y());
+ y2 = (int)Floor(p3->point.y());
// Find slopes (notice that if the y dists are 0, we don't care
// about the slopes)
xdelta = p1p3ydist == 0.0 ? 0.0 : p1p3xdist / p1p3ydist;
@@ -672,8 +672,8 @@ void ColorTriangle::DrawTrigon(QImage* buf, const QPointF& pa,
r = source.r;
g = source.g;
b = source.b;
- y1 = (int) floor(p1->point.y());
- y2 = (int) floor(p2->point.y());
+ y1 = (int)Floor(p1->point.y());
+ y2 = (int)Floor(p2->point.y());
// Find slopes (notice that if the y dists are 0, we don't care
// about the slopes)
xdelta = p1p2ydist == 0.0 ? 0.0 : p1p2xdist / p1p2ydist;
@@ -709,8 +709,8 @@ void ColorTriangle::DrawTrigon(QImage* buf, const QPointF& pa,
r = source.r;
g = source.g;
b = source.b;
- y1 = (int) floor(p2->point.y());
- y2 = (int) floor(p3->point.y());
+ y1 = (int)Floor(p2->point.y());
+ y2 = (int)Floor(p3->point.y());
// Find slopes (notice that if the y dists are 0, we don't care
// about the slopes)
xdelta = p2p3ydist == 0.0 ? 0.0 : p2p3xdist / p2p3ydist;
@@ -740,14 +740,14 @@ void ColorTriangle::DrawTrigon(QImage* buf, const QPointF& pa,
// Inner loop. For each y in the left map of x-values, draw one
// line from left to right.
- const int p3yfloor = int(floor(p3->point.y()));
+ const int p3yfloor = int(Floor(p3->point.y()));
- for (int y = int(floor(p1->point.y())); y < p3yfloor; ++y)
+ for (int y = int(Floor(p1->point.y())); y < p3yfloor; ++y)
{
double lx = leftX[y];
double rx = rightX[y];
- int lxi = (int) floor(lx);
- int rxi = (int) floor(rx);
+ int lxi = (int)Floor(lx);
+ int rxi = (int)Floor(rx);
DoubleColor rc = rightColors[y];
DoubleColor lc = leftColors[y];
// if the xdist is 0, don't draw anything.
@@ -809,10 +809,10 @@ void ColorTriangle::Color(const QColor& col)
double cy = (double) contentsRect().center().y();
double innerRadius = outerRadius - (outerRadius / 5.0);
double pointerRadius = outerRadius - (outerRadius / 10.0);
- pa = QPointF(cx + (cos(a) * innerRadius), cy - (sin(a) * innerRadius));
- pb = QPointF(cx + (cos(b) * innerRadius), cy - (sin(b) * innerRadius));
- pc = QPointF(cx + (cos(c) * innerRadius), cy - (sin(c) * innerRadius));
- pd = QPointF(cx + (cos(a) * pointerRadius), cy - (sin(a) * pointerRadius));
+ pa = QPointF(cx + (std::cos(a) * innerRadius), cy - (std::sin(a) * innerRadius));
+ pb = QPointF(cx + (std::cos(b) * innerRadius), cy - (std::sin(b) * innerRadius));
+ pc = QPointF(cx + (std::cos(c) * innerRadius), cy - (std::sin(c) * innerRadius));
+ pd = QPointF(cx + (std::cos(a) * pointerRadius), cy - (std::sin(a) * pointerRadius));
selectorPos = PointFromColor(curColor);
update();
emit ColorChanged(curColor);
@@ -862,7 +862,7 @@ double ColorTriangle::AngleAt(const QPointF& pos, const QRect& rect) const
if (mouserad == 0.0)
return 0.0;
- double angle = acos(mousexdist / mouserad);
+ double angle = std::acos(mousexdist / mouserad);
if (mouseydist >= 0)
angle = TWOPI - angle;
@@ -899,8 +899,8 @@ inline double vprod(double x1, double y1, double x2, double y2)
/*! \internal
- Returns true if the point cos(p),sin(p) is on the arc between
- cos(a1),sin(a1) and cos(a2),sin(a2); otherwise returns false.
+ Returns true if the point std::cos(p),sin(p) is on the arc between
+ cos(a1),sin(a1) and std::cos(a2),sin(a2); otherwise returns false.
*/
bool angleBetweenAngles(double p, double a1, double a2)
{
@@ -936,18 +936,18 @@ static bool pointAbovePoint(double x, double y, double px, double py,
{
bool result = false;
- if (floor(ax) > floor(bx))
+ if (Floor(ax) > Floor(bx))
{
- if (floor(ay) < floor(by))
+ if (Floor(ay) < Floor(by))
{
// line is draw upright-to-downleft
- if (floor(x) < floor(px) || floor(y) < floor(py))
+ if (Floor(x) < Floor(px) || Floor(y) < Floor(py))
result = true;
}
- else if (floor(ay) > floor(by))
+ else if (Floor(ay) > Floor(by))
{
// line is draw downright-to-upleft
- if (floor(x) > floor(px) || floor(y) < floor(py))
+ if (Floor(x) > Floor(px) || Floor(y) < Floor(py))
result = true;
}
else
@@ -956,18 +956,18 @@ static bool pointAbovePoint(double x, double y, double px, double py,
if (y < ay) result = true;
}
}
- else if (floor(ax) < floor(bx))
+ else if (Floor(ax) < Floor(bx))
{
- if (floor(ay) < floor(by))
+ if (Floor(ay) < Floor(by))
{
// line is draw upleft-to-downright
- if (floor(x) < floor(px) || floor(y) > floor(py))
+ if (Floor(x) < Floor(px) || Floor(y) > Floor(py))
result = true;
}
- else if (floor(ay) > floor(by))
+ else if (Floor(ay) > Floor(by))
{
// line is draw downleft-to-upright
- if (floor(x) > floor(px) || floor(y) > floor(py))
+ if (Floor(x) > Floor(px) || Floor(y) > Floor(py))
result = true;
}
else
@@ -980,11 +980,11 @@ static bool pointAbovePoint(double x, double y, double px, double py,
else
{
// line is vertical
- if (floor(ay) < floor(by))
+ if (Floor(ay) < Floor(by))
{
if (x < ax) result = true;
}
- else if (floor(ay) > floor(by))
+ else if (Floor(ay) > Floor(by))
{
if (x > ax) result = true;
}
@@ -1029,7 +1029,7 @@ static int pointInLine(double x, double y, double ax, double ay,
// line is draw downright-to-upleft
// If the line is flat, only use the x coordinate.
- if (floor(ay) == floor(by))
+ if (Floor(ay) == Floor(by))
{
// if (x is to the right of the rightmost point,
// return -1. otherwise if x is to the left of the
@@ -1074,7 +1074,7 @@ static int pointInLine(double x, double y, double ax, double ay,
// line is draw downleft-to-upright
// If the line is flat, only use the x coordinate.
- if (floor(ay) == floor(by))
+ if (Floor(ay) == Floor(by))
{
if (x <= ax)
return -1;
@@ -1128,7 +1128,7 @@ QPointF ColorTriangle::MovePointToTriangle(double x, double y, const Vertex& a,
double v2yA = b.point.y() - a.point.y();
double vpA = vprod(v1xA, v1yA, v2xA, v2yA);
double cosA = vpA / (vlen(v1xA, v1yA) * vlen(v2xA, v2yA));
- double alphaA = acos(cosA);
+ double alphaA = std::acos(cosA);
// Let v1B be the vector from x to b.
// Let v2B be the vector from b to c.
double v1xB = x - b.point.x();
@@ -1137,7 +1137,7 @@ QPointF ColorTriangle::MovePointToTriangle(double x, double y, const Vertex& a,
double v2yB = c.point.y() - b.point.y();
double vpB = vprod(v1xB, v1yB, v2xB, v2yB);
double cosB = vpB / (vlen(v1xB, v1yB) * vlen(v2xB, v2yB));
- double alphaB = acos(cosB);
+ double alphaB = std::acos(cosB);
// Let v1C be the vector from x to c.
// Let v2C be the vector from c back to a.
double v1xC = x - c.point.x();
@@ -1146,7 +1146,7 @@ QPointF ColorTriangle::MovePointToTriangle(double x, double y, const Vertex& a,
double v2yC = a.point.y() - c.point.y();
double vpC = vprod(v1xC, v1yC, v2xC, v2yC);
double cosC = vpC / (vlen(v1xC, v1yC) * vlen(v2xC, v2yC));
- double alphaC = acos(cosC);
+ double alphaC = std::acos(cosC);
// Find the radian angles between the (1,0) vector and the points
// A, B, C and (x,y). Use this information to determine which of
// the edges we should project (x,y) onto.
@@ -1164,8 +1164,8 @@ QPointF ColorTriangle::MovePointToTriangle(double x, double y, const Vertex& a,
// perpendicular projection from (x,y) onto a-b.
double pdist = std::sqrt(qsqr(x - a.point.x()) + qsqr(y - a.point.y()));
// the length of all edges is always > 0
- double p0x = a.point.x() + ((b.point.x() - a.point.x()) / vlen(v2xB, v2yB)) * cos(alphaA) * pdist;
- double p0y = a.point.y() + ((b.point.y() - a.point.y()) / vlen(v2xB, v2yB)) * cos(alphaA) * pdist;
+ double p0x = a.point.x() + ((b.point.x() - a.point.x()) / vlen(v2xB, v2yB)) * std::cos(alphaA) * pdist;
+ double p0y = a.point.y() + ((b.point.y() - a.point.y()) / vlen(v2xB, v2yB)) * std::cos(alphaA) * pdist;
// If (x,y) is above the a-b line, which basically means it's
// outside the triangle, then return its projection onto a-b.
@@ -1188,8 +1188,8 @@ QPointF ColorTriangle::MovePointToTriangle(double x, double y, const Vertex& a,
// If (x,y) is in the b-c area, project onto the b-c vector.
double pdist = std::sqrt(qsqr(x - b.point.x()) + qsqr(y - b.point.y()));
// the length of all edges is always > 0
- double p0x = b.point.x() + ((c.point.x() - b.point.x()) / vlen(v2xC, v2yC)) * cos(alphaB) * pdist;
- double p0y = b.point.y() + ((c.point.y() - b.point.y()) / vlen(v2xC, v2yC)) * cos(alphaB) * pdist;
+ double p0x = b.point.x() + ((c.point.x() - b.point.x()) / vlen(v2xC, v2yC)) * std::cos(alphaB) * pdist;
+ double p0y = b.point.y() + ((c.point.y() - b.point.y()) / vlen(v2xC, v2yC)) * std::cos(alphaB) * pdist;
if (pointAbovePoint(x, y, p0x, p0y, b.point.x(), b.point.y(), c.point.x(), c.point.y()))
{
@@ -1208,8 +1208,8 @@ QPointF ColorTriangle::MovePointToTriangle(double x, double y, const Vertex& a,
// If (x,y) is in the c-a area, project onto the c-a vector.
double pdist = std::sqrt(qsqr(x - c.point.x()) + qsqr(y - c.point.y()));
// the length of all edges is always > 0
- double p0x = c.point.x() + ((a.point.x() - c.point.x()) / vlen(v2xA, v2yA)) * cos(alphaC) * pdist;
- double p0y = c.point.y() + ((a.point.y() - c.point.y()) / vlen(v2xA, v2yA)) * cos(alphaC) * pdist;
+ double p0x = c.point.x() + ((a.point.x() - c.point.x()) / vlen(v2xA, v2yA)) * std::cos(alphaC) * pdist;
+ double p0y = c.point.y() + ((a.point.y() - c.point.y()) / vlen(v2xA, v2yA)) * std::cos(alphaC) * pdist;
if (pointAbovePoint(x, y, p0x, p0y, c.point.x(), c.point.y(), a.point.x(), a.point.y()))
{
@@ -1310,12 +1310,12 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
double cy = (double) contentsRect().center().y();
// Find the a, b and c from their angles, the center of the rect
// and the radius of the hue gradient donut.
- QPointF pa(cx + (cos(a) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(a) * (outerRadius - (outerRadius / 5.0))));
- QPointF pb(cx + (cos(b) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(b) * (outerRadius - (outerRadius / 5.0))));
- QPointF pc(cx + (cos(c) * (outerRadius - (outerRadius / 5.0))),
- cy - (sin(c) * (outerRadius - (outerRadius / 5.0))));
+ QPointF pa(cx + (std::cos(a) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(a) * (outerRadius - (outerRadius / 5.0))));
+ QPointF pb(cx + (std::cos(b) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(b) * (outerRadius - (outerRadius / 5.0))));
+ QPointF pc(cx + (std::cos(c) * (outerRadius - (outerRadius / 5.0))),
+ cy - (std::sin(c) * (outerRadius - (outerRadius / 5.0))));
// Find the hue value from the angle of the 'a' point.
double angle = a - M_PI / 2.0;
@@ -1325,7 +1325,7 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
// Create the color of the 'a' corner point. We know that b is
// black and c is white.
QColor color;
- color.setHsv(360 - (int) floor(hue), 255, 255);
+ color.setHsv(360 - (int)Floor(hue), 255, 255);
// See also drawTrigon(), which basically does exactly the same to
// determine all colors in the trigon.
Vertex aa(color, pa);
@@ -1371,7 +1371,7 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
{
leftx = p1->point.x();
- if (floor(p1p2ydist) != 0.0)
+ if (Floor(p1p2ydist) != 0.0)
{
leftx += (p1p2xdist * (p.y() - p1->point.y())) / p1p2ydist;
}
@@ -1384,7 +1384,7 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
{
leftx = p2->point.x();
- if (floor(p2p3ydist) != 0.0)
+ if (Floor(p2p3ydist) != 0.0)
{
leftx += (p2p3xdist * (p.y() - p2->point.y())) / p2p3ydist;
}
@@ -1406,7 +1406,7 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
{
rightx = p1->point.x();
- if (floor(p1p2ydist) != 0.0)
+ if (Floor(p1p2ydist) != 0.0)
{
rightx += (p1p2xdist * (p.y() - p1->point.y())) / p1p2ydist;
}
@@ -1419,7 +1419,7 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
{
rightx = p2->point.x();
- if (floor(p2p3ydist) != 0.0)
+ if (Floor(p2p3ydist) != 0.0)
{
rightx += (p2p3xdist * (p.y() - p2->point.y())) / p2p3ydist;
}
@@ -1437,7 +1437,7 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
if (firstshorty)
{
- if (floor(p1p2ydist) != 0.0)
+ if (Floor(p1p2ydist) != 0.0)
{
rshort = p2->color.r * (p.y() - p1->point.y()) / p1p2ydist;
gshort = p2->color.g * (p.y() - p1->point.y()) / p1p2ydist;
@@ -1482,7 +1482,7 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
}
else
{
- if (floor(p2p3ydist) != 0.0)
+ if (Floor(p2p3ydist) != 0.0)
{
rshort = p3->color.r * (p.y() - p2->point.y()) / p2p3ydist;
gshort = p3->color.g * (p.y() - p2->point.y()) / p2p3ydist;
@@ -1582,9 +1582,9 @@ QColor ColorTriangle::ColorFromPoint(const QPointF& p) const
// Now floor the color components and fit them into proper
// boundaries. This again is to compensate for the error caused by
// loss of precision.
- int ri = (int) floor(r);
- int gi = (int) floor(g);
- int bi = (int) floor(b);
+ int ri = (int)Floor(r);
+ int gi = (int)Floor(g);
+ int bi = (int)Floor(b);
if (ri < 0) ri = 0;
else if (ri > 255) ri = 255;
diff --git a/Source/Fractorium/PaletteEditor/PaletteEditor.cpp b/Source/Fractorium/PaletteEditor/PaletteEditor.cpp
index 52a8a6c..91f705a 100644
--- a/Source/Fractorium/PaletteEditor/PaletteEditor.cpp
+++ b/Source/Fractorium/PaletteEditor/PaletteEditor.cpp
@@ -112,7 +112,7 @@ void PaletteEditor::SetPalette(const Palette& palette)
/// Return a temporary copy of the xform color indices as a map.
/// The keys are the xform indices, and the values are the color indices.
///
-/// The color indices
+/// The color indices
map PaletteEditor::GetColorIndices() const
{
return m_GradientColorView->GetColorIndices();
@@ -122,12 +122,32 @@ map PaletteEditor::GetColorIndices() const
/// Assign the values of the xform color indices to the arrows.
/// This will clear out any existing values first.
///
-/// The color indices to assign
+/// The color indices to assign
void PaletteEditor::SetColorIndices(const map& indices)
{
m_GradientColorView->SetColorIndices(indices);
}
+///
+/// Return the filename of the currently selected palette.
+/// Note this will only be filled in if the user has clicked in the palette
+/// table at least once.
+///
+/// The palette filename
+string PaletteEditor::GetPaletteFile() const
+{
+ return m_CurrentPaletteFilePath;
+}
+
+///
+/// Set the selected palette file in the combo box.
+///
+/// The filename of the palette file to set to the current one
+void PaletteEditor::SetPaletteFile(const string& filename)
+{
+ ui->PaletteFilenameCombo->setCurrentText(QString::fromStdString(GetFilename(filename)));
+}
+
///
/// Add a new arrow using the current color.
/// Called when the Add Color button is clicked.
@@ -574,7 +594,8 @@ void PaletteEditor::EnablePaletteControls()
{
auto& palette = m_GradientColorView->GetPalette(256);
bool b = !palette.m_SourceColors.empty();
- ui->OverwritePaletteButton->setEnabled(b);
+ bool any = m_PaletteList->IsModifiable(m_CurrentPaletteFilePath);//At least one in the file is not fixed.
+ ui->OverwritePaletteButton->setEnabled(b && any);
ui->AddColorButton->setEnabled(b);
ui->DistributeColorsButton->setEnabled(b);
ui->AutoDistributeCheckBox->setEnabled(b);
diff --git a/Source/Fractorium/PaletteEditor/PaletteEditor.h b/Source/Fractorium/PaletteEditor/PaletteEditor.h
index 8685200..f9fc42a 100644
--- a/Source/Fractorium/PaletteEditor/PaletteEditor.h
+++ b/Source/Fractorium/PaletteEditor/PaletteEditor.h
@@ -34,6 +34,8 @@ public:
void SetPalette(const Palette& palette);
map GetColorIndices() const;
void SetColorIndices(const map& indices);
+ string GetPaletteFile() const;
+ void SetPaletteFile(const string& filename);
Q_SIGNALS:
void PaletteChanged();