Nicolas Winkler 5 years ago
parent
commit
cb10c34cc3

+ 1 - 1
MandelVideoGenerator.cpp

@@ -12,7 +12,7 @@ MandelVideoGenerator::MandelVideoGenerator(const ExportVideoInfo& evi) :
 void MandelVideoGenerator::generate(void)
 {
     mnd::MandelContext ctxt = mnd::initializeContext();
-    mnd::Generator& gen = ctxt.getDefaultGenerator();//*ctxt.getDevices()[0].getGeneratorDouble();
+    mnd::Generator& gen = ctxt.getDefaultGenerator();
     mnd::MandelInfo mi;
     mi.bWidth = evi.width * 2;
     mi.bHeight = evi.height * 2;

+ 3 - 3
MandelWidget.cpp

@@ -220,7 +220,7 @@ void MandelView::adaptViewport(const MandelInfo mi)
 MandelWidget::MandelWidget(mnd::MandelContext& ctxt, QWidget* parent) :
     QGLWidget{ QGLFormat(QGL::SampleBuffers), parent },
     mndContext{ ctxt },
-    mv{ ctxt.getCpuGeneratorDouble(), gradient, this }
+    mv{ ctxt.getDefaultGenerator(), gradient, this }
 {
     this->setContentsMargins(0, 0, 0, 0);
     this->setSizePolicy(QSizePolicy::Expanding,
@@ -228,11 +228,11 @@ MandelWidget::MandelWidget(mnd::MandelContext& ctxt, QWidget* parent) :
     QObject::connect(&mv, &MandelView::updated, this, &MandelWidget::viewUpdated, Qt::AutoConnection);
     QObject::connect(this, &MandelWidget::needsUpdate, &mv, &MandelView::adaptViewport, Qt::DirectConnection);
 
-    if (!ctxt.getDevices().empty()) {
+    /*if (!ctxt.getDevices().empty()) {
         if (auto* gen = ctxt.getDevices()[0].getGeneratorDouble(); gen) {
             mv.setGenerator(*gen);
         }
-    }
+    }*/
 }
 
 

+ 8 - 0
MandelWidget.h

@@ -41,6 +41,14 @@ public:
     void drawRect(float x, float y, float width, float height);
 };
 
+
+struct MandelClip
+{
+    mnd::MandelViewport view;
+
+};
+
+
 class MandelView : public QObject
 {
     Q_OBJECT

+ 4 - 1
exportdialogs.cpp

@@ -13,6 +13,7 @@ ExportImageDialog::ExportImageDialog(QWidget* parent) :
     QDialog{ parent }
 {
     eid.setupUi(this);
+    this->adjustSize();
     eid.maxIterations->setValidator(new QIntValidator(1, 1000000000, this));
     eid.imgWidth->setValidator(new QIntValidator(1, 10000000, this));
     eid.imgHeight->setValidator(new QIntValidator(1, 10000000, this));
@@ -47,7 +48,8 @@ void ExportImageDialog::on_pushButton_clicked()
     QString saveAs = QFileDialog::getSaveFileName(this,
             tr("Save exported image"), "",
             tr("PNG image (*.png);;JPEG image (*.jpg);;All Files (*)"));
-    eid.savePath->setText(saveAs);
+    if(!saveAs.isEmpty() && !saveAs.isNull())
+        eid.savePath->setText(saveAs);
     this->repaint();
 }
 
@@ -67,6 +69,7 @@ ExportVideoDialog::ExportVideoDialog(QWidget* parent, const ExportVideoInfo& evi
     evi{ evi }
 {
     evd.setupUi(this);
+    this->adjustSize();
     evd.maxIterations->setValidator(new QIntValidator(1, 1000000000, this));
     evd.vidWidth->setValidator(new QIntValidator(1, 10000000, this));
     evd.vidHeight->setValidator(new QIntValidator(1, 10000000, this));

+ 101 - 82
exportimagedialog.ui

@@ -6,93 +6,112 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>392</width>
-    <height>170</height>
+    <width>712</width>
+    <height>227</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Dialog</string>
   </property>
-  <widget class="QDialogButtonBox" name="buttonBox">
-   <property name="geometry">
-    <rect>
-     <x>40</x>
-     <y>130</y>
-     <width>341</width>
-     <height>32</height>
-    </rect>
-   </property>
-   <property name="orientation">
-    <enum>Qt::Horizontal</enum>
-   </property>
-   <property name="standardButtons">
-    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-   </property>
-  </widget>
-  <widget class="QWidget" name="formLayoutWidget">
-   <property name="geometry">
-    <rect>
-     <x>10</x>
-     <y>10</y>
-     <width>371</width>
-     <height>111</height>
-    </rect>
-   </property>
-   <layout class="QFormLayout" name="formLayout">
-    <item row="0" column="0">
-     <widget class="QLabel" name="label">
-      <property name="text">
-       <string>Maximum iterations</string>
-      </property>
-     </widget>
-    </item>
-    <item row="0" column="1">
-     <widget class="QLineEdit" name="maxIterations">
-      <property name="text">
-       <string>5000</string>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="0">
-     <widget class="QLabel" name="label_2">
-      <property name="text">
-       <string>Image Width</string>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="1">
-     <widget class="QLineEdit" name="imgWidth">
-      <property name="text">
-       <string>1920</string>
-      </property>
-     </widget>
-    </item>
-    <item row="2" column="0">
-     <widget class="QLabel" name="label_3">
-      <property name="text">
-       <string>Image Height</string>
-      </property>
-     </widget>
-    </item>
-    <item row="2" column="1">
-     <widget class="QLineEdit" name="imgHeight">
-      <property name="text">
-       <string>1080</string>
-      </property>
-     </widget>
-    </item>
-    <item row="3" column="0">
-     <widget class="QPushButton" name="pushButton">
-      <property name="text">
-       <string>Save As</string>
-      </property>
-     </widget>
-    </item>
-    <item row="3" column="1">
-     <widget class="QLineEdit" name="savePath"/>
-    </item>
-   </layout>
-  </widget>
+  <property name="sizeGripEnabled">
+   <bool>false</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QFormLayout" name="formLayout">
+     <property name="sizeConstraint">
+      <enum>QLayout::SetDefaultConstraint</enum>
+     </property>
+     <property name="rowWrapPolicy">
+      <enum>QFormLayout::DontWrapRows</enum>
+     </property>
+     <item row="0" column="0">
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Maximum iterations</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLineEdit" name="maxIterations">
+       <property name="minimumSize">
+        <size>
+         <width>200</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="text">
+        <string>5000</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>Image Width</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="imgWidth">
+       <property name="text">
+        <string>1920</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>Image Height</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QLineEdit" name="imgHeight">
+       <property name="text">
+        <string>1080</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="0">
+      <widget class="QPushButton" name="pushButton">
+       <property name="text">
+        <string>Save As</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="1">
+      <widget class="QLineEdit" name="savePath">
+       <property name="minimumSize">
+        <size>
+         <width>500</width>
+         <height>0</height>
+        </size>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Ignored" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections>

+ 132 - 128
exportvideodialog.ui

@@ -6,139 +6,143 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>393</width>
-    <height>219</height>
+    <width>666</width>
+    <height>313</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Dialog</string>
   </property>
-  <widget class="QDialogButtonBox" name="buttonBox">
-   <property name="geometry">
-    <rect>
-     <x>40</x>
-     <y>180</y>
-     <width>341</width>
-     <height>32</height>
-    </rect>
-   </property>
-   <property name="orientation">
-    <enum>Qt::Horizontal</enum>
-   </property>
-   <property name="standardButtons">
-    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-   </property>
-  </widget>
-  <widget class="QWidget" name="formLayoutWidget">
-   <property name="geometry">
-    <rect>
-     <x>10</x>
-     <y>10</y>
-     <width>371</width>
-     <height>161</height>
-    </rect>
-   </property>
-   <layout class="QFormLayout" name="formLayout">
-    <item row="0" column="0">
-     <widget class="QLabel" name="label">
-      <property name="text">
-       <string>Maximum iterations</string>
-      </property>
-     </widget>
-    </item>
-    <item row="0" column="1">
-     <widget class="QLineEdit" name="maxIterations">
-      <property name="text">
-       <string>5000</string>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="0">
-     <widget class="QLabel" name="label_2">
-      <property name="text">
-       <string>Video Width</string>
-      </property>
-     </widget>
-    </item>
-    <item row="2" column="0">
-     <widget class="QLabel" name="label_3">
-      <property name="text">
-       <string>Video Height</string>
-      </property>
-     </widget>
-    </item>
-    <item row="1" column="1">
-     <widget class="QLineEdit" name="vidWidth">
-      <property name="text">
-       <string>1920</string>
-      </property>
-     </widget>
-    </item>
-    <item row="2" column="1">
-     <widget class="QLineEdit" name="vidHeight">
-      <property name="text">
-       <string>1080</string>
-      </property>
-     </widget>
-    </item>
-    <item row="5" column="0">
-     <widget class="QPushButton" name="pushButton">
-      <property name="text">
-       <string>Save As</string>
-      </property>
-     </widget>
-    </item>
-    <item row="5" column="1">
-     <widget class="QLineEdit" name="savePath"/>
-    </item>
-    <item row="3" column="0">
-     <widget class="QLabel" name="label_4">
-      <property name="text">
-       <string>Start View</string>
-      </property>
-     </widget>
-    </item>
-    <item row="3" column="1">
-     <layout class="QHBoxLayout" name="horizontalLayout">
-      <item>
-       <widget class="QLineEdit" name="startX"/>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="startY"/>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="startW"/>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="startH"/>
-      </item>
-     </layout>
-    </item>
-    <item row="4" column="0">
-     <widget class="QLabel" name="label_5">
-      <property name="text">
-       <string>End View</string>
-      </property>
-     </widget>
-    </item>
-    <item row="4" column="1">
-     <layout class="QHBoxLayout" name="horizontalLayout_2">
-      <item>
-       <widget class="QLineEdit" name="endX"/>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="endY"/>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="endW"/>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="endH"/>
-      </item>
-     </layout>
-    </item>
-   </layout>
-  </widget>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QFormLayout" name="formLayout">
+     <property name="sizeConstraint">
+      <enum>QLayout::SetMinimumSize</enum>
+     </property>
+     <item row="0" column="0">
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Maximum iterations</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLineEdit" name="maxIterations">
+       <property name="text">
+        <string>5000</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>Video Width</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>Video Height</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="vidWidth">
+       <property name="text">
+        <string>1920</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QLineEdit" name="vidHeight">
+       <property name="text">
+        <string>1080</string>
+       </property>
+      </widget>
+     </item>
+     <item row="5" column="0">
+      <widget class="QPushButton" name="pushButton">
+       <property name="text">
+        <string>Save As</string>
+       </property>
+      </widget>
+     </item>
+     <item row="5" column="1">
+      <widget class="QLineEdit" name="savePath">
+       <property name="minimumSize">
+        <size>
+         <width>400</width>
+         <height>0</height>
+        </size>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="0">
+      <widget class="QLabel" name="label_4">
+       <property name="text">
+        <string>Start View</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QLineEdit" name="startX"/>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="startY"/>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="startW"/>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="startH"/>
+       </item>
+      </layout>
+     </item>
+     <item row="4" column="0">
+      <widget class="QLabel" name="label_5">
+       <property name="text">
+        <string>End View</string>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <widget class="QLineEdit" name="endX"/>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="endY"/>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="endW"/>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="endH"/>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Ignored" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections>

+ 19 - 2
libmandel/include/Generators.h

@@ -3,10 +3,16 @@
 
 #include "MandelUtil.h"
 
+#include <vector>
+#include <utility>
+
+
 
 namespace mnd
 {
     class Generator;
+
+    class AdaptiveGenerator;
 }
 
 
@@ -16,10 +22,10 @@ public:
     Generator(void) = default;
     virtual ~Generator(void);
 
-    
+
     Generator(const Generator&) = delete;
     Generator& operator=(const Generator&) = delete;
-    
+
     Generator(Generator&&) = default;
     Generator& operator=(Generator&&) = default;
 
@@ -27,4 +33,15 @@ public:
 };
 
 
+class mnd::AdaptiveGenerator : public Generator
+{
+    std::vector<std::pair<double, Generator*>> generators;
+public:
+    AdaptiveGenerator(Generator* floatGen, Generator* doubleGen);
+    virtual ~AdaptiveGenerator(void) = default;
+
+    virtual void generate(const MandelInfo& info, float* data);
+};
+
+
 #endif // MANDEL_GENERATORS_H

+ 2 - 0
libmandel/include/Mandel.h

@@ -52,6 +52,8 @@ private:
     std::unique_ptr<Generator> cpuGeneratorDouble;
     std::unique_ptr<Generator> cpuGenerator128;
 
+    std::unique_ptr<Generator> adaptiveGenerator;
+
     std::vector<MandelDevice> devices;
 
     MandelContext(void);

+ 35 - 0
libmandel/src/Generators.cpp

@@ -1,9 +1,44 @@
 #include "Generators.h"
 
+#include <cstdio>
+
 using mnd::Generator;
+using mnd::AdaptiveGenerator;
 
 Generator::~Generator(void)
 {
 }
 
 
+AdaptiveGenerator::AdaptiveGenerator(Generator* floatGen, Generator* doubleGen)
+{
+    generators.push_back({ 0.0000001, floatGen });
+    generators.push_back({ 0.0, doubleGen });
+}
+
+
+void AdaptiveGenerator::generate(const mnd::MandelInfo& info, float* data)
+{
+    double pixelW = info.view.width / info.bWidth;
+    double pixelH = info.view.height / info.bHeight;
+    double minimum = pixelW < pixelH ? pixelW : pixelH;
+
+    Generator* toUse = nullptr;
+    int i = 0;
+
+    for (auto [thresh, gen] : generators) {
+        ++i;
+        if (minimum > thresh) {
+            toUse = gen;
+            break;
+        }
+    }
+    if (toUse != nullptr) {
+        toUse->generate(info, data);
+    }
+    else {
+
+    }
+}
+
+

+ 4 - 1
libmandel/src/mandel.cpp

@@ -7,6 +7,7 @@
 using mnd::MandelDevice;
 using mnd::MandelContext;
 using mnd::Generator;
+using mnd::AdaptiveGenerator;
 
 
 
@@ -78,6 +79,8 @@ MandelContext::MandelContext(void)
 
     cpuGenerator128 = std::make_unique<CpuGenerator<Fixed128>>();
 
+    adaptiveGenerator = std::make_unique<AdaptiveGenerator>(cpuGeneratorFloat.get(), cpuGeneratorDouble.get());
+
     devices = createDevices();
 }
 
@@ -154,7 +157,7 @@ const std::string& MandelDevice::getName(void) const
 
 Generator& MandelContext::getDefaultGenerator(void)
 {
-    return getCpuGeneratorDouble();
+    return *adaptiveGenerator;
 }