|
@@ -228,6 +228,8 @@ void Job::run(void)
|
|
mi->bWidth = mi->bHeight = MandelView::chunkSize;
|
|
mi->bWidth = mi->bHeight = MandelView::chunkSize;
|
|
mi->maxIter = owner.getMaxIterations();
|
|
mi->maxIter = owner.getMaxIterations();
|
|
mi->smooth = owner.getSmoothColoring();
|
|
mi->smooth = owner.getSmoothColoring();
|
|
|
|
+ mi->juliaX = juliaX;
|
|
|
|
+ mi->juliaY = juliaY;
|
|
try {
|
|
try {
|
|
generator->generate(*mi, f.pixels.get());
|
|
generator->generate(*mi, f.pixels.get());
|
|
auto* rgb = new Bitmap<RGBColor>(f.map<RGBColor>([&mi, this](float i) {
|
|
auto* rgb = new Bitmap<RGBColor>(f.map<RGBColor>([&mi, this](float i) {
|
|
@@ -246,11 +248,11 @@ void Job::run(void)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-Calcer::Calcer(mnd::Generator* generator, MandelWidget& owner, int maxIter, bool smooth) :
|
|
|
|
|
|
+Calcer::Calcer(mnd::MandelGenerator* generator, MandelWidget& owner, int maxIter, bool smooth) :
|
|
jobsMutex{ QMutex::Recursive },
|
|
jobsMutex{ QMutex::Recursive },
|
|
generator{ generator },
|
|
generator{ generator },
|
|
- owner{ owner },
|
|
|
|
threadPool{ std::make_unique<QThreadPool>() },
|
|
threadPool{ std::make_unique<QThreadPool>() },
|
|
|
|
+ owner{ owner },
|
|
gradient{ owner.getGradient() },
|
|
gradient{ owner.getGradient() },
|
|
maxIter{ maxIter },
|
|
maxIter{ maxIter },
|
|
smooth{ smooth }
|
|
smooth{ smooth }
|
|
@@ -273,11 +275,19 @@ void Calcer::clearAll(void)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+void Calcer::setJuliaPos(const mnd::Real& x, const mnd::Real& y)
|
|
|
|
+{
|
|
|
|
+ this->juliaX = x;
|
|
|
|
+ this->juliaY = y;
|
|
|
|
+ changeState();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
void Calcer::calc(TexGrid& grid, int level, GridIndex i, GridIndex j, int priority)
|
|
void Calcer::calc(TexGrid& grid, int level, GridIndex i, GridIndex j, int priority)
|
|
{
|
|
{
|
|
jobsMutex.lock();
|
|
jobsMutex.lock();
|
|
if (jobs.find({ level, i, j }) == jobs.end()) {
|
|
if (jobs.find({ level, i, j }) == jobs.end()) {
|
|
- Job* job = new Job(generator, gradient, owner, &grid, level, i, j, calcState);
|
|
|
|
|
|
+ Job* job = new Job(generator, gradient, owner, &grid, level, i, j, juliaX, juliaY, calcState);
|
|
connect(job, &Job::done, this, &Calcer::redirect);
|
|
connect(job, &Job::done, this, &Calcer::redirect);
|
|
connect(job, &QObject::destroyed, this, [this, level, i, j] () { this->notFinished(level, i, j); });
|
|
connect(job, &QObject::destroyed, this, [this, level, i, j] () { this->notFinished(level, i, j); });
|
|
jobs.emplace(std::tuple{level, i, j}, job);
|
|
jobs.emplace(std::tuple{level, i, j}, job);
|
|
@@ -333,7 +343,7 @@ void Calcer::redirect(int level, GridIndex i, GridIndex j, long calcState, Bitma
|
|
|
|
|
|
const int MandelView::chunkSize = 256;
|
|
const int MandelView::chunkSize = 256;
|
|
|
|
|
|
-MandelView::MandelView(mnd::Generator* generator, MandelWidget& owner, int maxIter) :
|
|
|
|
|
|
+MandelView::MandelView(mnd::MandelGenerator* generator, MandelWidget& owner, int maxIter) :
|
|
generator{ generator },
|
|
generator{ generator },
|
|
calcer{ generator, owner, maxIter, owner.getSmoothColoring() },
|
|
calcer{ generator, owner, maxIter, owner.getSmoothColoring() },
|
|
owner{ owner },
|
|
owner{ owner },
|
|
@@ -390,7 +400,7 @@ void MandelView::setMaxIter(int maxIter)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-void MandelView::setGenerator(mnd::Generator* generator)
|
|
|
|
|
|
+void MandelView::setGenerator(mnd::MandelGenerator* generator)
|
|
{
|
|
{
|
|
if (this->generator != generator) {
|
|
if (this->generator != generator) {
|
|
this->generator = generator;
|
|
this->generator = generator;
|
|
@@ -581,7 +591,7 @@ void MandelView::cellReady(int level, GridIndex i, GridIndex j, Bitmap<RGBColor>
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-MandelWidget::MandelWidget(mnd::MandelContext& ctxt, mnd::Generator* generator, QWidget* parent) :
|
|
|
|
|
|
+MandelWidget::MandelWidget(mnd::MandelContext& ctxt, mnd::MandelGenerator* generator, QWidget* parent) :
|
|
QOpenGLWidget{ parent },
|
|
QOpenGLWidget{ parent },
|
|
mndContext{ ctxt },
|
|
mndContext{ ctxt },
|
|
generator{ generator },
|
|
generator{ generator },
|
|
@@ -650,7 +660,14 @@ void MandelWidget::setMaxIterations(int maxIter)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-void MandelWidget::setGenerator(mnd::Generator* generator)
|
|
|
|
|
|
+void MandelWidget::setJuliaPos(const mnd::Real& x, const mnd::Real& y)
|
|
|
|
+{
|
|
|
|
+ if (mandelView)
|
|
|
|
+ mandelView->calcer.setJuliaPos(x, y);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+void MandelWidget::setGenerator(mnd::MandelGenerator* generator)
|
|
{
|
|
{
|
|
if (this->generator != generator) {
|
|
if (this->generator != generator) {
|
|
this->generator = generator;
|
|
this->generator = generator;
|
|
@@ -710,6 +727,8 @@ void MandelWidget::paintGL(void)
|
|
drawRubberband();
|
|
drawRubberband();
|
|
if (displayInfo)
|
|
if (displayInfo)
|
|
drawInfo();
|
|
drawInfo();
|
|
|
|
+ if (selectingPoint)
|
|
|
|
+ drawPoint();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -806,6 +825,19 @@ void MandelWidget::drawInfo(void)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+void MandelWidget::drawPoint(void)
|
|
|
|
+{
|
|
|
|
+ glColor3ub(255, 255, 255);
|
|
|
|
+ glBegin(GL_LINES);
|
|
|
|
+ glVertex2f(0, pointY);
|
|
|
|
+ glVertex2f(width(), pointY);
|
|
|
|
+
|
|
|
|
+ glVertex2f(pointX, 0);
|
|
|
|
+ glVertex2f(pointX, height());
|
|
|
|
+ glEnd();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
void MandelWidget::zoom(float scale, float x, float y)
|
|
void MandelWidget::zoom(float scale, float x, float y)
|
|
{
|
|
{
|
|
targetViewport.zoom(scale, x, y);
|
|
targetViewport.zoom(scale, x, y);
|
|
@@ -826,6 +858,13 @@ void MandelWidget::setViewport(const mnd::MandelViewport& viewport)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+void MandelWidget::selectPoint(void)
|
|
|
|
+{
|
|
|
|
+ this->selectingPoint = true;
|
|
|
|
+ this->setMouseTracking(true);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
void MandelWidget::requestRecalc()
|
|
void MandelWidget::requestRecalc()
|
|
{
|
|
{
|
|
emit update();
|
|
emit update();
|
|
@@ -869,6 +908,7 @@ void MandelWidget::mousePressEvent(QMouseEvent* me)
|
|
void MandelWidget::mouseMoveEvent(QMouseEvent* me)
|
|
void MandelWidget::mouseMoveEvent(QMouseEvent* me)
|
|
{
|
|
{
|
|
QOpenGLWidget::mouseMoveEvent(me);
|
|
QOpenGLWidget::mouseMoveEvent(me);
|
|
|
|
+
|
|
if (rubberbanding) {
|
|
if (rubberbanding) {
|
|
QRectF& rect = rubberband;
|
|
QRectF& rect = rubberband;
|
|
double aspect = double(geometry().width()) / geometry().height();
|
|
double aspect = double(geometry().width()) / geometry().height();
|
|
@@ -880,6 +920,11 @@ void MandelWidget::mouseMoveEvent(QMouseEvent* me)
|
|
|
|
|
|
emit repaint();
|
|
emit repaint();
|
|
}
|
|
}
|
|
|
|
+ else if (selectingPoint) {
|
|
|
|
+ pointX = me->x();
|
|
|
|
+ pointY = me->y();
|
|
|
|
+ emit repaint();
|
|
|
|
+ }
|
|
else if (dragging) {
|
|
else if (dragging) {
|
|
double deltaX = me->x() - dragX;
|
|
double deltaX = me->x() - dragX;
|
|
double deltaY = me->y() - dragY;
|
|
double deltaY = me->y() - dragY;
|
|
@@ -913,6 +958,14 @@ void MandelWidget::mouseReleaseEvent(QMouseEvent* me)
|
|
requestRecalc();
|
|
requestRecalc();
|
|
rubberbanding = false;
|
|
rubberbanding = false;
|
|
}
|
|
}
|
|
|
|
+ else if (selectingPoint) {
|
|
|
|
+ selectingPoint = false;
|
|
|
|
+ this->setMouseTracking(false);
|
|
|
|
+ mnd::Real x = currentViewport.x + currentViewport.width * mnd::convert<mnd::Real>(float(me->x()) / width());
|
|
|
|
+ mnd::Real y = currentViewport.y + currentViewport.height * mnd::convert<mnd::Real>(float(me->y()) / height());
|
|
|
|
+ emit pointSelected(x, y);
|
|
|
|
+ emit repaint();
|
|
|
|
+ }
|
|
dragging = false;
|
|
dragging = false;
|
|
|
|
|
|
//requestRecalc();
|
|
//requestRecalc();
|