mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-02-23 13:31:31 -05:00
--User changes
-Add the ability to drag the rotation of the current palette via the palette preview table.
This commit is contained in:
parent
ed74fd6a83
commit
cd1749fe5f
@ -305,12 +305,14 @@ public:
|
|||||||
palette = *this;
|
palette = *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto tempPal = palette;
|
||||||
|
|
||||||
for (size_t i = 0; i < Size(); i++)
|
for (size_t i = 0; i < Size(); i++)
|
||||||
{
|
{
|
||||||
size_t ii = (i * 256) / COLORMAP_LENGTH;
|
int ii = int(i);
|
||||||
rgb[0] = palette[(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].r;//Rotation.
|
rgb[0] = tempPal[std::abs(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].r;//Rotation.
|
||||||
rgb[1] = palette[(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].g;
|
rgb[1] = tempPal[std::abs(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].g;
|
||||||
rgb[2] = palette[(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].b;
|
rgb[2] = tempPal[std::abs(COLORMAP_LENGTH + ii - rot) % COLORMAP_LENGTH].b;
|
||||||
RgbToHsv(rgb, hsv);
|
RgbToHsv(rgb, hsv);
|
||||||
hsv[0] += hue * T(6.0);//Hue.
|
hsv[0] += hue * T(6.0);//Hue.
|
||||||
hsv[1] = Clamp<T>(hsv[1] + sat, 0, 1);//Saturation.
|
hsv[1] = Clamp<T>(hsv[1] + sat, 0, 1);//Saturation.
|
||||||
@ -331,7 +333,7 @@ public:
|
|||||||
|
|
||||||
if (blur > 0)
|
if (blur > 0)
|
||||||
{
|
{
|
||||||
Palette<T> blurPal = palette;
|
tempPal = palette;
|
||||||
|
|
||||||
for (int i = 0; i < 256; i++)
|
for (int i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
@ -347,9 +349,9 @@ public:
|
|||||||
|
|
||||||
if (k != i)
|
if (k != i)
|
||||||
{
|
{
|
||||||
rgb[0] = rgb[0] + blurPal[k].r;
|
rgb[0] = rgb[0] + tempPal[k].r;
|
||||||
rgb[1] = rgb[1] + blurPal[k].g;
|
rgb[1] = rgb[1] + tempPal[k].g;
|
||||||
rgb[2] = rgb[2] + blurPal[k].b;
|
rgb[2] = rgb[2] + tempPal[k].b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,6 +325,10 @@ public slots:
|
|||||||
void OnPaletteAdjust(int d);
|
void OnPaletteAdjust(int d);
|
||||||
void OnPaletteCellClicked(int row, int col);
|
void OnPaletteCellClicked(int row, int col);
|
||||||
void OnPaletteCellDoubleClicked(int row, int col);
|
void OnPaletteCellDoubleClicked(int row, int col);
|
||||||
|
void OnPreviewPaletteMouseDragged(const QPointF& local, const QPoint& global);
|
||||||
|
void OnPreviewPaletteMouseReleased();
|
||||||
|
void OnPreviewPaletteCellDoubleClicked(int row, int col);
|
||||||
|
void OnPreviewPaletteCellPressed(int row, int col);
|
||||||
void OnPaletteRandomSelectButtonClicked(bool checked);
|
void OnPaletteRandomSelectButtonClicked(bool checked);
|
||||||
void OnPaletteRandomAdjustButtonClicked(bool checked);
|
void OnPaletteRandomAdjustButtonClicked(bool checked);
|
||||||
void OnPaletteEditorButtonClicked(bool checked);
|
void OnPaletteEditorButtonClicked(bool checked);
|
||||||
@ -513,8 +517,12 @@ private:
|
|||||||
DoubleSpinBoxTableItemDelegate* m_XaosTableItemDelegate;
|
DoubleSpinBoxTableItemDelegate* m_XaosTableItemDelegate;
|
||||||
|
|
||||||
//Palette.
|
//Palette.
|
||||||
bool m_PaletteChanged;
|
bool m_PaletteChanged = false;
|
||||||
bool m_PaletteFileChanged;
|
bool m_PaletteFileChanged = false;
|
||||||
|
bool m_PreviewPaletteMouseDown = false;
|
||||||
|
int m_PreviewPaletteMouseDownRotation = 0;
|
||||||
|
int m_PreviewPaletteRotation = 0;
|
||||||
|
QPoint m_PreviewPaletteMouseDownPosition = QPoint(0, 0);
|
||||||
SpinBox* m_PaletteHueSpin;
|
SpinBox* m_PaletteHueSpin;
|
||||||
SpinBox* m_PaletteSaturationSpin;
|
SpinBox* m_PaletteSaturationSpin;
|
||||||
SpinBox* m_PaletteBrightnessSpin;
|
SpinBox* m_PaletteBrightnessSpin;
|
||||||
|
@ -13,6 +13,10 @@ void Fractorium::InitPaletteUI()
|
|||||||
connect(ui.PaletteFilenameCombo, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(OnPaletteFilenameComboChanged(const QString&)), Qt::QueuedConnection);
|
connect(ui.PaletteFilenameCombo, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(OnPaletteFilenameComboChanged(const QString&)), Qt::QueuedConnection);
|
||||||
connect(paletteTable, SIGNAL(cellClicked(int, int)), this, SLOT(OnPaletteCellClicked(int, int)), Qt::QueuedConnection);
|
connect(paletteTable, SIGNAL(cellClicked(int, int)), this, SLOT(OnPaletteCellClicked(int, int)), Qt::QueuedConnection);
|
||||||
connect(paletteTable, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(OnPaletteCellDoubleClicked(int, int)), Qt::QueuedConnection);
|
connect(paletteTable, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(OnPaletteCellDoubleClicked(int, int)), Qt::QueuedConnection);
|
||||||
|
connect(palettePreviewTable, SIGNAL(MouseDragged(const QPointF&, const QPoint&)), this, SLOT(OnPreviewPaletteMouseDragged(const QPointF&, const QPoint&)), Qt::QueuedConnection);
|
||||||
|
connect(palettePreviewTable, SIGNAL(MouseReleased()), this, SLOT(OnPreviewPaletteMouseReleased()), Qt::QueuedConnection);
|
||||||
|
connect(palettePreviewTable, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(OnPreviewPaletteCellDoubleClicked(int, int)), Qt::QueuedConnection);
|
||||||
|
connect(palettePreviewTable, SIGNAL(cellPressed(int, int)), this, SLOT(OnPreviewPaletteCellPressed(int, int)), Qt::QueuedConnection);
|
||||||
//Palette adjustment table.
|
//Palette adjustment table.
|
||||||
auto table = ui.PaletteAdjustTable;
|
auto table = ui.PaletteAdjustTable;
|
||||||
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//Split width over all columns evenly.
|
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//Split width over all columns evenly.
|
||||||
@ -34,6 +38,7 @@ void Fractorium::InitPaletteUI()
|
|||||||
palettePreviewTable->setItem(0, 0, previewNameCol);
|
palettePreviewTable->setItem(0, 0, previewNameCol);
|
||||||
auto previewPaletteItem = new QTableWidgetItem();
|
auto previewPaletteItem = new QTableWidgetItem();
|
||||||
palettePreviewTable->setItem(0, 1, previewPaletteItem);
|
palettePreviewTable->setItem(0, 1, previewPaletteItem);
|
||||||
|
palettePreviewTable->installEventFilter(this);
|
||||||
connect(ui.PaletteFilterLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnPaletteFilterLineEditTextChanged(const QString&)));
|
connect(ui.PaletteFilterLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(OnPaletteFilterLineEditTextChanged(const QString&)));
|
||||||
connect(ui.PaletteFilterClearButton, SIGNAL(clicked(bool)), this, SLOT(OnPaletteFilterClearButtonClicked(bool)));
|
connect(ui.PaletteFilterClearButton, SIGNAL(clicked(bool)), this, SLOT(OnPaletteFilterClearButtonClicked(bool)));
|
||||||
paletteTable->setColumnWidth(1, 260);//256 plus small margin on each side.
|
paletteTable->setColumnWidth(1, 260);//256 plus small margin on each side.
|
||||||
@ -140,7 +145,7 @@ void FractoriumEmberController<T>::ApplyPaletteToEmber()
|
|||||||
double contrast = double(m_Fractorium->m_PaletteContrastSpin->value() > 0 ? (m_Fractorium->m_PaletteContrastSpin->value() * 2) : m_Fractorium->m_PaletteContrastSpin->value()) / 100.0;
|
double contrast = double(m_Fractorium->m_PaletteContrastSpin->value() > 0 ? (m_Fractorium->m_PaletteContrastSpin->value() * 2) : m_Fractorium->m_PaletteContrastSpin->value()) / 100.0;
|
||||||
double hue = double(m_Fractorium->m_PaletteHueSpin->value()) / 360.0;
|
double hue = double(m_Fractorium->m_PaletteHueSpin->value()) / 360.0;
|
||||||
//Use the temp palette as the base and apply the adjustments gotten from the GUI and save the result in the ember palette.
|
//Use the temp palette as the base and apply the adjustments gotten from the GUI and save the result in the ember palette.
|
||||||
m_TempPalette.MakeAdjustedPalette(m_Ember.m_Palette, 0, hue, sat, brightness, contrast, blur, freq);
|
m_TempPalette.MakeAdjustedPalette(m_Ember.m_Palette, m_Fractorium->m_PreviewPaletteRotation, hue, sat, brightness, contrast, blur, freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -249,6 +254,61 @@ void Fractorium::OnPaletteCellClicked(int row, int col)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the mouse has been moved while pressed on the palette preview table.
|
||||||
|
/// Computes the difference between where the mouse was clicked and where it is now, then
|
||||||
|
/// uses that difference as a rotation value to pass into the palette adjustment.
|
||||||
|
/// Updates the palette and resets the rendering process.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="local">The local mouse coordinates relative to the palette preview table</param>
|
||||||
|
/// <param name="global">The global mouse coordinates</param>
|
||||||
|
void Fractorium::OnPreviewPaletteMouseDragged(const QPointF& local, const QPoint& global)
|
||||||
|
{
|
||||||
|
if (m_PreviewPaletteMouseDown)
|
||||||
|
{
|
||||||
|
m_PreviewPaletteRotation = m_PreviewPaletteMouseDownRotation + (global.x() - m_PreviewPaletteMouseDownPosition.x());
|
||||||
|
//qDebug() << "Palette preview table drag reached main window event: " << local.x() << ' ' << local.y() << ", global: " << global.x() << ' ' << global.y() << ", final: " << m_PreviewPaletteRotation;
|
||||||
|
m_Controller->PaletteAdjust();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the mouse has been released over the palette preview table.
|
||||||
|
/// Does nothing but set the dragging state to false.
|
||||||
|
/// </summary>
|
||||||
|
void Fractorium::OnPreviewPaletteMouseReleased()
|
||||||
|
{
|
||||||
|
m_PreviewPaletteMouseDown = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the palette rotation to zero.
|
||||||
|
/// Updates the palette and resets the rendering process.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="row">Ignored</param>
|
||||||
|
/// <param name="col">Ignored</param>
|
||||||
|
void Fractorium::OnPreviewPaletteCellDoubleClicked(int row, int col)
|
||||||
|
{
|
||||||
|
m_PreviewPaletteRotation = 0;
|
||||||
|
m_PreviewPaletteMouseDown = false;
|
||||||
|
m_Controller->PaletteAdjust();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the mouse has been pressed on the palette preview table.
|
||||||
|
/// Subsequent mouse movements will compute a rotation value to pass into the palette adjustment, based on the location
|
||||||
|
/// of the mouse when this slot is called.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="row">Ignored</param>
|
||||||
|
/// <param name="col">Ignored</param>
|
||||||
|
void Fractorium::OnPreviewPaletteCellPressed(int row, int col)
|
||||||
|
{
|
||||||
|
m_PreviewPaletteMouseDown = true;
|
||||||
|
m_PreviewPaletteMouseDownPosition = QCursor::pos();//Get the global mouse position.
|
||||||
|
m_PreviewPaletteMouseDownRotation = m_PreviewPaletteRotation;
|
||||||
|
//qDebug() << "Mouse down with initial pos: " << m_PreviewPaletteMouseDownPosition.x() << " and initial rotation: " << m_PreviewPaletteMouseDownRotation;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set the selected palette as the current one,
|
/// Set the selected palette as the current one,
|
||||||
/// resetting any adjustments previously specified.
|
/// resetting any adjustments previously specified.
|
||||||
|
@ -520,7 +520,7 @@ void GLEmberController<T>::DrawAffines(bool pre, bool post)
|
|||||||
#else
|
#else
|
||||||
GLfloat vertices[] =//Should these be of type T?//TODO
|
GLfloat vertices[] =//Should these be of type T?//TODO
|
||||||
{
|
{
|
||||||
m_DragHandlePos.x, m_DragHandlePos.y
|
GLfloat(m_DragHandlePos.x), GLfloat(m_DragHandlePos.y)
|
||||||
};
|
};
|
||||||
QVector4D col(1.0f, 1.0f, 0.5f, 1.0f);
|
QVector4D col(1.0f, 1.0f, 0.5f, 1.0f);
|
||||||
m_GL->DrawPointOrLine(col, vertices, 1, GL_POINTS);
|
m_GL->DrawPointOrLine(col, vertices, 1, GL_POINTS);
|
||||||
@ -545,14 +545,14 @@ void GLEmberController<T>::DrawAffines(bool pre, bool post)
|
|||||||
#else
|
#else
|
||||||
GLfloat vertices[] =//Should these be of type T?//TODO
|
GLfloat vertices[] =//Should these be of type T?//TODO
|
||||||
{
|
{
|
||||||
m_MouseDownWorldPos.x, m_MouseDownWorldPos.y,//UL->UR
|
GLfloat(m_MouseDownWorldPos.x), GLfloat(m_MouseDownWorldPos.y),//UL->UR
|
||||||
m_MouseWorldPos.x, m_MouseDownWorldPos.y,
|
GLfloat(m_MouseWorldPos.x ), GLfloat(m_MouseDownWorldPos.y),
|
||||||
m_MouseDownWorldPos.x, m_MouseWorldPos.y,//LL->LR
|
GLfloat(m_MouseDownWorldPos.x), GLfloat(m_MouseWorldPos.y),//LL->LR
|
||||||
m_MouseWorldPos.x, m_MouseWorldPos.y,
|
GLfloat(m_MouseWorldPos.x ), GLfloat(m_MouseWorldPos.y),
|
||||||
m_MouseDownWorldPos.x, m_MouseDownWorldPos.y,//UL->LL
|
GLfloat(m_MouseDownWorldPos.x), GLfloat(m_MouseDownWorldPos.y),//UL->LL
|
||||||
m_MouseDownWorldPos.x, m_MouseWorldPos.y,
|
GLfloat(m_MouseDownWorldPos.x), GLfloat(m_MouseWorldPos.y),
|
||||||
m_MouseWorldPos.x, m_MouseDownWorldPos.y,//UR->LR
|
GLfloat(m_MouseWorldPos.x ), GLfloat(m_MouseDownWorldPos.y),//UR->LR
|
||||||
m_MouseWorldPos.x, m_MouseWorldPos.y
|
GLfloat(m_MouseWorldPos.x ), GLfloat(m_MouseWorldPos.y)
|
||||||
};
|
};
|
||||||
QVector4D col(0.0f, 0.0f, 1.0f, 1.0f);
|
QVector4D col(0.0f, 0.0f, 1.0f, 1.0f);
|
||||||
m_GL->DrawPointOrLine(col, vertices, 8, GL_LINES);
|
m_GL->DrawPointOrLine(col, vertices, 8, GL_LINES);
|
||||||
@ -570,7 +570,7 @@ void GLEmberController<T>::DrawAffines(bool pre, bool post)
|
|||||||
#else
|
#else
|
||||||
GLfloat vertices[] =//Should these be of type T?//TODO
|
GLfloat vertices[] =//Should these be of type T?//TODO
|
||||||
{
|
{
|
||||||
m_HoverHandlePos.x, m_HoverHandlePos.y
|
GLfloat(m_HoverHandlePos.x), GLfloat(m_HoverHandlePos.y)
|
||||||
};
|
};
|
||||||
QVector4D col(0.5f, 1.0f, 1.0f, 1.0f);
|
QVector4D col(0.5f, 1.0f, 1.0f, 1.0f);
|
||||||
m_GL->DrawPointOrLine(col, vertices, 1, GL_POINTS);
|
m_GL->DrawPointOrLine(col, vertices, 1, GL_POINTS);
|
||||||
@ -931,7 +931,7 @@ void GLWidget::wheelEvent(QWheelEvent* e)
|
|||||||
/// <param name="drawType">The type of primitive to draw, such as GL_POINT or GL_LINES</param>
|
/// <param name="drawType">The type of primitive to draw, such as GL_POINT or GL_LINES</param>
|
||||||
void GLWidget::DrawPointOrLine(const QVector4D& col, const std::vector<float>& vertices, int drawType)
|
void GLWidget::DrawPointOrLine(const QVector4D& col, const std::vector<float>& vertices, int drawType)
|
||||||
{
|
{
|
||||||
DrawPointOrLine(col, vertices.data(), vertices.size() / 2, drawType);
|
DrawPointOrLine(col, vertices.data(), int(vertices.size() / 2), drawType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -37,9 +37,16 @@ public:
|
|||||||
viewport()->installEventFilter(this);
|
viewport()->installEventFilter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void MouseDragged(const QPointF& local, const QPoint& global);
|
||||||
|
void MouseReleased();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event filter to ignore mouse wheel events.
|
/// Event filter to ignore mouse wheel events and also handle others such as mouse move and mouse button release.
|
||||||
|
/// Sadly, QTableWidget makes these hard to get to, so we must handle them here.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="obj">The object sending the event</param>
|
/// <param name="obj">The object sending the event</param>
|
||||||
/// <param name="e">The event</param>
|
/// <param name="e">The event</param>
|
||||||
@ -51,6 +58,17 @@ protected:
|
|||||||
e->ignore();
|
e->ignore();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (e->type() == QEvent::MouseMove)
|
||||||
|
{
|
||||||
|
if (auto me = dynamic_cast<QMouseEvent*>(e))
|
||||||
|
{
|
||||||
|
emit MouseDragged(me->localPos(), me->globalPos());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (e->type() == QEvent::MouseButtonRelease)
|
||||||
|
{
|
||||||
|
emit MouseReleased();
|
||||||
|
}
|
||||||
|
|
||||||
return QTableWidget::eventFilter(obj, e);
|
return QTableWidget::eventFilter(obj, e);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user