Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

qopenglwindow-based replacement of qglwidget, full glsl shader based waveforms, vumeters and spinnies #10989

Merged
merged 122 commits into from May 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
8aef319
replaced use of qglwidget with wglwidget, add qopengl renderers, qope…
m0dB Oct 13, 2022
3b1b5d1
wspinny qopengl implementation as extension of standard wspinny with …
m0dB Feb 11, 2023
facaab9
wvumetergl qopengl implementation as extension of standard wvumetergl…
m0dB Feb 11, 2023
30d65eb
using float instead of fixedpoint for rgb waveform
m0dB Feb 11, 2023
b037a13
use VERIFY_OR_DEBUG_ASSERT
m0dB Feb 11, 2023
b53d0a5
default QOPENGL ON for all platforms
m0dB Feb 11, 2023
3d4ed50
Update src/waveform/renderers/qopengl/waveformrendererendoftrack.cpp
m0dB Feb 17, 2023
a536cc4
dont always return true from shouldRender, comments, minor changes (a…
m0dB Feb 18, 2023
41e1f72
check if shaders are available for vumeter and spinny, else fall back…
m0dB Feb 18, 2023
ca37ebe
qopengl equivalent of querying opengl version and capabilities
m0dB Feb 18, 2023
d79ee4a
simplified class hierarchy by removing IWaveformWidget and add virtua…
m0dB Feb 19, 2023
80279cf
remove wrong/unneeded calls to makeCurrent / doneCurrent
m0dB Feb 19, 2023
9e7213b
explicitely render from paintGL to fix artifacts when resizing the wi…
m0dB Feb 19, 2023
58120bc
propagate resizeGL to widget and renderers, resize markers in resizeG…
m0dB Feb 19, 2023
a480188
tweaks for more correct drawing of markers
m0dB Feb 19, 2023
9b2cb77
avoid rare marker position rounding issue
m0dB Feb 20, 2023
92bb195
fix tooltips for qopengl based wglwidgets
m0dB Mar 4, 2023
8fed99c
avoid float conversion errors on ubuntu 22.04 gcc
m0dB Mar 4, 2023
eae49c7
more strict use of float/double to be able to compile these files wit…
m0dB Mar 4, 2023
7541dd5
removed const from static_cast
m0dB Mar 4, 2023
2dbaf56
postpone initialization until the initial qopenglwindow has been exposed
m0dB Mar 5, 2023
fb6e90c
draw correct slip position ghost in qopengl spinny
m0dB Mar 5, 2023
ddeb54c
support vertical orientation by rotating the matrix (and thus removed…
m0dB Mar 5, 2023
18333b7
missing include memory
m0dB Mar 16, 2023
5029f5e
explanation of qopengl classes and files
m0dB Mar 17, 2023
ffbd20b
explanation of qopengl classes and files - formatting
m0dB Mar 17, 2023
dfbe712
clear color buffer bit on paintDevice() request
m0dB Mar 17, 2023
bffc84c
fix crash of glvsynctestwidget
m0dB Mar 17, 2023
b5bc098
fixed tooltips for wglwidgetqopengl
m0dB Mar 18, 2023
2a4a27d
Update CMakeLists.txt
m0dB Mar 18, 2023
786ed1e
assert samplerate is positive
m0dB Mar 18, 2023
f28943d
simplified qopengl::WaveformRenderBackground: removed unused pixmap b…
m0dB Mar 18, 2023
4de1da5
improved m_beatLineVertices memory management as suggested by @Swiftb0y
m0dB Mar 18, 2023
a085b87
reserve (and assert) the read amount of vertices in waveformrenderbeat
m0dB Mar 18, 2023
bfd4286
using reserve and push_back in qopengl::WaveformRendererrRGB
m0dB Mar 18, 2023
7a0a95e
use "using" instead of "#define" for qgl vs qopengl classes
m0dB Mar 18, 2023
bee4fe4
qopengl filteredwaveformwidget
m0dB Mar 18, 2023
9b70593
correct reserve
m0dB Mar 18, 2023
6b1dcd2
c++ syntax instead of signal slot macros
m0dB Mar 18, 2023
beb30a0
add RGB renderer with separate RGB color for L/R channel
m0dB Apr 10, 2023
9ba52cd
revert accidental use of direct connection for spinnies and vumeters …
m0dB Apr 10, 2023
d3bc7dd
Update README-QOpenGL.md
m0dB Apr 10, 2023
1e51f63
Update src/widget/tooltipqopengl.cpp
m0dB Apr 10, 2023
80cdf32
remove unneeded QT_FORWARD_DECLARE_CLASS
m0dB Apr 10, 2023
2271ac6
add comment clarifying need for handleEventFromWindow and moved toolt…
m0dB Apr 10, 2023
52a9bdc
explicit call to clear paint device
m0dB Apr 10, 2023
e212e0d
added comments explaining qopengl::WaveformRenderer
m0dB Apr 11, 2023
7a041c0
removed obsolete commented code
m0dB Apr 11, 2023
3218eb6
Update src/waveform/renderers/qopengl/waveformrendererendoftrack.cpp
m0dB Apr 11, 2023
578e5f9
using constexpr in anon namespace, using named const vars instead of …
m0dB Apr 11, 2023
88c9d1b
removed unneeded inline
m0dB Apr 11, 2023
0f1901e
minor api change
m0dB Apr 11, 2023
2ad4199
improved comment
m0dB Apr 11, 2023
1b49354
typp
m0dB Apr 11, 2023
83b8719
remove code duplication by using a for loop for left/right channel
m0dB Apr 11, 2023
9bd12df
limit preroll triangles to does that will be on screen + additional c…
m0dB Apr 11, 2023
2b14751
avoid corner case mismatch between reserved and drawn beat markers
m0dB Apr 11, 2023
99e87bd
using vectors of QVector2D and QVector3D instead of float + cleanup
m0dB Apr 11, 2023
a87a7be
moved shaders to files to reduce code duplication
m0dB Apr 11, 2023
2594742
reduced code duplication by encapsulating vertex and color data in cl…
m0dB Apr 11, 2023
326d4d3
reduced code duplication by moving ortho matrix calculation to helper…
m0dB Apr 11, 2023
e31da64
Update src/waveform/renderers/qopengl/waveformrendererfiltered.cpp
m0dB Apr 15, 2023
9c725a3
beter var name from visualIncrementPerPixel
m0dB Apr 15, 2023
864906e
added DEBUG_ASSERT(false)
m0dB Apr 15, 2023
4f6a056
use encapsulation instead of inheritence of colordata and vertexdata,…
m0dB Apr 15, 2023
fafa14f
added simple qopengl waveform renderer
m0dB Apr 15, 2023
1986780
renamed calculatematrix to matrixforwidgetgeometry, removed unused wi…
m0dB Apr 15, 2023
fd82ed3
protect call to numBeatsInRange from invalid positions
m0dB Apr 27, 2023
e2f6ffa
using QTimer instead of unique_ptr<QTimer>, several cleanups, particu…
m0dB Apr 27, 2023
ec9e6a2
removed unused include
m0dB Apr 27, 2023
76032dd
rename function that draws to mark to drawMark
m0dB Apr 27, 2023
97285fe
changed user-facing names of waveforms types
m0dB Apr 27, 2023
3729370
avoid double to float conversion warning
m0dB Apr 27, 2023
4b28aaf
fix clazy error
m0dB Apr 27, 2023
75d2554
removed unnecesary dtor
m0dB Apr 27, 2023
10c266a
put back some ifdefs that get lost and some missing Q_OBJECTs
m0dB Apr 27, 2023
05f6a46
ran precommit manually
m0dB Apr 27, 2023
fac0bdc
moved qopengl/shaders
m0dB Apr 29, 2023
9114f54
minor changes and improved comments based on review
m0dB Apr 29, 2023
09f21f7
count beats without calling numBeatsInRange
m0dB Apr 29, 2023
51cd5c0
added missing use of matrixForWidgetGeometry
m0dB Apr 29, 2023
38f53ee
fix clazy
m0dB Apr 29, 2023
a5afde1
fix typo
m0dB Apr 29, 2023
4f4909e
better fix for flickering when resizing
m0dB Apr 29, 2023
e1509e4
use QApplication::sendEvent instead of handleWindowFromEvent. this is…
m0dB Apr 29, 2023
a847b9b
correctly calculate max amount of preroll triangles
m0dB Apr 30, 2023
ae7fe08
pass tooltip for waveformviewer to waveform widget
m0dB Apr 30, 2023
4145abc
properly forward events to wwaveformviewer, fixes cue mark hovering
m0dB Apr 30, 2023
41b692f
forward events to wglwaveformwidget to wwaveformviewer
m0dB Apr 30, 2023
ed84c8e
avoid flickering with legacy gl waveform widgets
m0dB Apr 30, 2023
e1ec6fb
postpone extra render to avoid flicker until next paintGL
m0dB May 1, 2023
33ec185
glwaveformrenderbackground replacement for waveformrenderbackground u…
m0dB May 1, 2023
8e90e2a
using glwaveformrendererbackground to draw background for legacy gl w…
m0dB May 1, 2023
a2a1c3c
moved folders and namespaces
m0dB May 1, 2023
8a47d05
cleanup and formatting post rebase on 2.4, compile allshader widgets …
m0dB May 1, 2023
16c05e6
fix pre-commit
m0dB May 1, 2023
7c078ca
simplified handling events from openglwindow, removed unneeded layer …
m0dB May 3, 2023
968b279
removed unnecessary windowExposed, as we can rely on initializeGL to …
m0dB May 4, 2023
c45043e
use local var
m0dB May 4, 2023
61589ed
set openglwindow event target to waveformviewer
m0dB May 5, 2023
5c6c774
Revert "set openglwindow event target to waveformviewer"
m0dB May 5, 2023
b3f0ed8
fixes post-rebase
m0dB May 6, 2023
18378e4
use custom mechanism to deliver drag&drop events coming from the QOpe…
m0dB May 6, 2023
c4093c6
formatting
m0dB May 6, 2023
6d033dd
fixed bug in Paintable::toImage
m0dB May 12, 2023
3111e6b
dont create qopengltexture without valid context or with null images
m0dB May 13, 2023
e25f0f4
use glsl spinnies and vumeters with qopengl only
m0dB May 13, 2023
298033e
remove unnecessary includes
m0dB May 13, 2023
60132d5
use p prefix for pointers
m0dB May 13, 2023
bf72f07
call WGLWidget resizeGL with devicePixelRatio applied, to mimic QGLWi…
m0dB May 13, 2023
1631d50
added helper that creates qopengltexture and sets linear filtering
m0dB May 15, 2023
e10dab9
removed spurious makeCurrentIfNeeded, postpone call to slotLoadTrack …
m0dB May 15, 2023
0fbf597
set the context when calling WGLWidget::resizeGL, to mimic QGLWidget
m0dB May 17, 2023
4ec3fba
apply devicePixelRatio when scaling images to widget size (reducing c…
m0dB May 17, 2023
a606587
calculate the visual split position just like the play position
m0dB May 18, 2023
d01787c
dont use allshaders waveforms with QOPENGL=OFF
m0dB May 18, 2023
63cdb15
fix for style not being applied correctly to WWidgetGroup when the vi…
m0dB May 19, 2023
27d9a79
compile and show qt waveforms only when MIXXX_USE_QOPENGL is not set
m0dB May 19, 2023
67a59af
tentative fix for spinny positions scaled drawing
m0dB May 20, 2023
63a626d
clear WInitialGLWidget
m0dB May 27, 2023
5a69bc3
added missing calls to doneCurrent for correctness
m0dB May 27, 2023
670d4dd
clear winitialglwidget in its paintGL
m0dB May 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
70 changes: 59 additions & 11 deletions CMakeLists.txt
Expand Up @@ -110,6 +110,11 @@ endif()

option(QT6 "Build with Qt6" OFF)

option(QOPENGL "Use QOpenGLWindow based widget instead of QGLWidget" ON)
if(QOPENGL)
add_compile_definitions(MIXXX_USE_QOPENGL)
endif()

if(APPLE)
if(QT6)
# Minimum macOS version supported by Qt 6
Expand Down Expand Up @@ -965,6 +970,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL
src/util/battery/battery.cpp
src/util/cache.cpp
src/util/cmdlineargs.cpp
src/util/colorcomponents.cpp
src/util/color/color.cpp
src/util/color/colorpalette.cpp
src/util/color/predefinedcolorpalettes.cpp
Expand Down Expand Up @@ -1021,7 +1027,6 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL
src/util/valuetransformer.cpp
src/util/versionstore.cpp
src/util/widgethelper.cpp
src/util/widgetrendertimer.cpp
src/util/workerthread.cpp
src/util/workerthreadscheduler.cpp
src/util/xml.cpp
Expand Down Expand Up @@ -1095,7 +1100,6 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL
src/widget/wtracktableviewheader.cpp
src/widget/wtracktext.cpp
src/widget/wtrackwidgetgroup.cpp
src/widget/wvumeter.cpp
src/widget/wwidget.cpp
src/widget/wwidgetgroup.cpp
src/widget/wwidgetstack.cpp
Expand Down Expand Up @@ -1127,9 +1131,6 @@ else()
src/waveform/renderers/glwaveformrendererfilteredsignal.cpp
src/waveform/renderers/glwaveformrendererrgb.cpp
src/waveform/renderers/glwaveformrenderersimplesignal.cpp
src/waveform/renderers/qtvsynctestrenderer.cpp
src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
src/waveform/renderers/waveformmark.cpp
src/waveform/renderers/waveformmarkrange.cpp
src/waveform/renderers/waveformmarkset.cpp
Expand Down Expand Up @@ -1157,12 +1158,8 @@ else()
src/waveform/widgets/glslwaveformwidget.cpp
src/waveform/widgets/glvsynctestwidget.cpp
src/waveform/widgets/glwaveformwidget.cpp
src/waveform/widgets/glwaveformwidgetabstract.cpp
src/waveform/widgets/hsvwaveformwidget.cpp
src/waveform/widgets/qthsvwaveformwidget.cpp
src/waveform/widgets/qtrgbwaveformwidget.cpp
src/waveform/widgets/qtsimplewaveformwidget.cpp
src/waveform/widgets/qtvsynctestwidget.cpp
src/waveform/widgets/qtwaveformwidget.cpp
src/waveform/widgets/rgbwaveformwidget.cpp
src/waveform/widgets/softwarewaveformwidget.cpp
src/waveform/widgets/waveformwidgetabstract.cpp
Expand All @@ -1171,10 +1168,61 @@ else()
src/widget/woverviewlmh.cpp
src/widget/woverviewrgb.cpp
src/widget/wspinny.cpp
src/widget/wvumetergl.cpp
src/widget/wspinnybase.cpp
src/widget/wvumeter.cpp
src/widget/wvumeterbase.cpp
src/widget/wvumeterlegacy.cpp
src/widget/wwaveformviewer.cpp
)
if(QOPENGL)
target_sources(mixxx-lib PRIVATE
src/shaders/endoftrackshader.cpp
src/shaders/rgbashader.cpp
src/shaders/rgbshader.cpp
src/shaders/shader.cpp
src/shaders/textureshader.cpp
src/shaders/unicolorshader.cpp
src/util/texture.cpp
src/waveform/renderers/allshader/matrixforwidgetgeometry.cpp
src/waveform/renderers/allshader/waveformrenderbackground.cpp
src/waveform/renderers/allshader/waveformrenderbeat.cpp
src/waveform/renderers/allshader/waveformrenderer.cpp
src/waveform/renderers/allshader/waveformrendererendoftrack.cpp
src/waveform/renderers/allshader/waveformrendererfiltered.cpp
src/waveform/renderers/allshader/waveformrendererlrrgb.cpp
src/waveform/renderers/allshader/waveformrendererpreroll.cpp
src/waveform/renderers/allshader/waveformrendererrgb.cpp
src/waveform/renderers/allshader/waveformrenderersignalbase.cpp
src/waveform/renderers/allshader/waveformrenderersimple.cpp
src/waveform/renderers/allshader/waveformrendermark.cpp
src/waveform/renderers/allshader/waveformrendermarkrange.cpp
src/waveform/widgets/allshader/filteredwaveformwidget.cpp
src/waveform/widgets/allshader/lrrgbwaveformwidget.cpp
src/waveform/widgets/allshader/rgbwaveformwidget.cpp
src/waveform/widgets/allshader/simplewaveformwidget.cpp
src/waveform/widgets/allshader/waveformwidget.cpp
src/widget/openglwindow.cpp
src/widget/tooltipqopengl.cpp
src/widget/wglwidgetqopengl.cpp
src/widget/winitialglwidget.cpp
src/widget/wspinnyglsl.cpp
src/widget/wvumeterglsl.cpp
)
else()
target_sources(mixxx-lib PRIVATE
src/waveform/renderers/qtvsynctestrenderer.cpp
src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp
src/waveform/renderers/qtwaveformrenderersimplesignal.cpp
src/waveform/widgets/qthsvwaveformwidget.cpp
src/waveform/widgets/qtrgbwaveformwidget.cpp
src/waveform/widgets/qtsimplewaveformwidget.cpp
src/waveform/widgets/qtvsynctestwidget.cpp
src/waveform/widgets/qtwaveformwidget.cpp
src/widget/wglwidgetqglwidget.cpp
)
endif()
endif()

set_target_properties(mixxx-lib PROPERTIES AUTOMOC ON AUTOUIC ON CXX_CLANG_TIDY "${CLANG_TIDY}")
target_include_directories(mixxx-lib PUBLIC src "${CMAKE_CURRENT_BINARY_DIR}/src")
if(UNIX AND NOT APPLE)
Expand Down
14 changes: 11 additions & 3 deletions src/engine/enginebuffer.cpp
Expand Up @@ -590,7 +590,7 @@ void EngineBuffer::ejectTrack() {
TrackPointer pOldTrack = m_pCurrentTrack;
m_pause.lock();

m_visualPlayPos->set(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
m_visualPlayPos->set(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
doSeekPlayPos(mixxx::audio::kStartFramePos, SEEK_EXACT);

m_pCurrentTrack.reset();
Expand Down Expand Up @@ -1385,14 +1385,21 @@ void EngineBuffer::updateIndicators(double speed, int iBufferSize) {
m_iSamplesSinceLastIndicatorUpdate += iBufferSize;

const double fFractionalPlaypos = fractionalPlayposFromAbsolute(m_playPosition);
const double fFractionalSlipPos = fractionalPlayposFromAbsolute(m_slipPosition);

const double tempoTrackSeconds = m_trackEndPositionOld.value() /
m_trackSampleRateOld / getRateRatio();
if (speed > 0 && fFractionalPlaypos == 1.0) {
// At Track end
// Play pos at Track end
speed = 0;
}

double effectiveSlipRate = m_dSlipRate;
if (effectiveSlipRate > 0.0 && fFractionalSlipPos == 1.0) {
// Slip pos at Track end
effectiveSlipRate = 0.0;
}

// Update indicators that are only updated after every
// sampleRate/kiUpdateRate samples processed. (e.g. playposSlider)
if (m_iSamplesSinceLastIndicatorUpdate >
Expand All @@ -1409,7 +1416,8 @@ void EngineBuffer::updateIndicators(double speed, int iBufferSize) {
speed * m_baserate_old,
static_cast<int>(iBufferSize) /
m_trackEndPositionOld.toEngineSamplePos(),
fractionalPlayposFromAbsolute(m_slipPosition),
fFractionalSlipPos,
effectiveSlipRate,
tempoTrackSeconds,
iBufferSize / kSamplesPerFrame / m_sampleRate.toDouble() * 1000000.0);

Expand Down
11 changes: 11 additions & 0 deletions src/main.cpp
Expand Up @@ -59,7 +59,15 @@ int runMixxx(MixxxApplication* pApp, const CmdlineArgs& args) {
&mainWindow,
&MixxxMainWindow::initializationProgressUpdate);
pCoreServices->initialize(pApp);

#ifdef MIXXX_USE_QOPENGL
// Will call initialize when the initial wglwidget's
// qopenglwindow has been exposed
mainWindow.initializeQOpenGL();
#else
daschuer marked this conversation as resolved.
Show resolved Hide resolved
mainWindow.initialize();
#endif

pCoreServices->getControllerManager()->setUpDevices();

// If startup produced a fatal error, then don't even start the
Expand Down Expand Up @@ -124,6 +132,9 @@ int main(int argc, char * argv[]) {
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif
#ifdef MIXXX_USE_QOPENGL
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
#endif

// workaround for https://bugreports.qt.io/browse/QTBUG-84363
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) && QT_VERSION < QT_VERSION_CHECK(5, 15, 1)
Expand Down
40 changes: 39 additions & 1 deletion src/mixxxmainwindow.cpp
Expand Up @@ -2,7 +2,16 @@

#include <QDesktopServices>
#include <QFileDialog>

#include "widget/wglwidget.h"

#ifdef MIXXX_USE_QOPENGL
#include "widget/tooltipqopengl.h"
#include "widget/winitialglwidget.h"
#else
#include <QGLFormat>
#endif

#include <QUrl>
#ifdef __LINUX__
#include <QtDBus>
Expand Down Expand Up @@ -138,6 +147,27 @@ MixxxMainWindow::MixxxMainWindow(std::shared_ptr<mixxx::CoreServices> pCoreServi
m_pVisualsManager = new VisualsManager();
}

#ifdef MIXXX_USE_QOPENGL
void MixxxMainWindow::initializeQOpenGL() {
if (!CmdlineArgs::Instance().getSafeMode()) {
// This widget and its QOpenGLWindow will be used to query QOpenGL
// information (version, driver, etc) in WaveformWidgetFactory.
// The "SharedGLContext" terminology here doesn't really apply,
// but allows us to take advantage of the existing classes.
WInitialGLWidget* widget = new WInitialGLWidget(this);
widget->setGeometry(QRect(0, 0, 3, 3));
SharedGLContext::setWidget(widget);
// When the widget's QOpenGLWindow has been initialized, we continue
// with the actual initialization
connect(widget, &WInitialGLWidget::onInitialized, this, &MixxxMainWindow::initialize);
widget->show();
// note: the format is set in the WGLWidget's OpenGLWindow constructor
} else {
initialize();
}
}
#endif

void MixxxMainWindow::initialize() {
m_pCoreServices->getControlIndicatorTimer()->setLegacyVsyncEnabled(true);

Expand All @@ -147,6 +177,9 @@ void MixxxMainWindow::initialize() {
m_toolTipsCfg = static_cast<mixxx::TooltipsPreference>(
pConfig->getValue(ConfigKey("[Controls]", "Tooltips"),
static_cast<int>(mixxx::TooltipsPreference::TOOLTIPS_ON)));
#ifdef MIXXX_USE_QOPENGL
ToolTipQOpenGL::singleton().setActive(m_toolTipsCfg == mixxx::TooltipsPreference::TOOLTIPS_ON);
#endif

#ifdef __ENGINEPRIME__
// Initialise library exporter
Expand Down Expand Up @@ -194,6 +227,7 @@ void MixxxMainWindow::initialize() {
}
});

#ifndef MIXXX_USE_QOPENGL
// Before creating the first skin we need to create a QGLWidget so that all
// the QGLWidget's we create can use it as a shared QGLContext.
if (!CmdlineArgs::Instance().getSafeMode() && QGLFormat::hasOpenGL()) {
Expand All @@ -218,11 +252,12 @@ void MixxxMainWindow::initialize() {
glFormat.setRgba(true);
QGLFormat::setDefaultFormat(glFormat);

QGLWidget* pContextWidget = new QGLWidget(this);
WGLWidget* pContextWidget = new WGLWidget(this);
pContextWidget->setGeometry(QRect(0, 0, 3, 3));
pContextWidget->hide();
SharedGLContext::setWidget(pContextWidget);
}
#endif

WaveformWidgetFactory::createInstance(); // takes a long time
WaveformWidgetFactory::instance()->setConfig(m_pCoreServices->getSettings());
Expand Down Expand Up @@ -1015,6 +1050,9 @@ void MixxxMainWindow::slotShowKeywheel(bool toggle) {

void MixxxMainWindow::slotTooltipModeChanged(mixxx::TooltipsPreference tt) {
m_toolTipsCfg = tt;
#ifdef MIXXX_USE_QOPENGL
ToolTipQOpenGL::singleton().setActive(m_toolTipsCfg == mixxx::TooltipsPreference::TOOLTIPS_ON);
#endif
}

void MixxxMainWindow::rebootMixxxView() {
Expand Down
3 changes: 3 additions & 0 deletions src/mixxxmainwindow.h
Expand Up @@ -41,6 +41,9 @@ class MixxxMainWindow : public QMainWindow {
MixxxMainWindow(std::shared_ptr<mixxx::CoreServices> pCoreServices);
~MixxxMainWindow() override;

#ifdef MIXXX_USE_QOPENGL
void initializeQOpenGL();
#endif
/// Initialize main window after creation. Should only be called once.
void initialize();
/// creates the menu_bar and inserts the file Menu
Expand Down
29 changes: 29 additions & 0 deletions src/shaders/endoftrackshader.cpp
@@ -0,0 +1,29 @@
#include "shaders/endoftrackshader.h"

using namespace mixxx;

void EndOfTrackShader::init() {
QString vertexShaderCode = QStringLiteral(R"--(
attribute vec4 position;
attribute float gradient;
varying float vgradient;
void main()
{
vgradient = gradient;
gl_Position = position;
}
)--");

QString fragmentShaderCode = QStringLiteral(R"--(
uniform vec4 color;
varying float vgradient;
void main()
{
float minAlpha = 0.5 * color.w;
float maxAlpha = 0.83 * color.w;
gl_FragColor = vec4(color.xyz, mix(minAlpha, maxAlpha, max(0.,vgradient)));
}
)--");

load(vertexShaderCode, fragmentShaderCode);
}
17 changes: 17 additions & 0 deletions src/shaders/endoftrackshader.h
@@ -0,0 +1,17 @@
#pragma once

#include "shaders/shader.h"

namespace mixxx {
class EndOfTrackShader;
}

class mixxx::EndOfTrackShader : public mixxx::Shader {
public:
EndOfTrackShader() = default;
~EndOfTrackShader() = default;
void init();

private:
DISALLOW_COPY_AND_ASSIGN(EndOfTrackShader)
};
27 changes: 27 additions & 0 deletions src/shaders/rgbashader.cpp
@@ -0,0 +1,27 @@
#include "shaders/rgbashader.h"

using namespace mixxx;

void RGBAShader::init() {
QString vertexShaderCode = QStringLiteral(R"--(
uniform mat4 matrix;
attribute vec4 position;
attribute vec4 color;
varying vec4 vcolor;
void main()
{
vcolor = color;
gl_Position = matrix * position;
}
)--");

QString fragmentShaderCode = QStringLiteral(R"--(
varying vec4 vcolor;
void main()
{
gl_FragColor = vcolor;
}
)--");

load(vertexShaderCode, fragmentShaderCode);
}
17 changes: 17 additions & 0 deletions src/shaders/rgbashader.h
@@ -0,0 +1,17 @@
#pragma once

#include "shaders/shader.h"

namespace mixxx {
class RGBAShader;
}

class mixxx::RGBAShader final : public mixxx::Shader {
public:
RGBAShader() = default;
~RGBAShader() = default;
void init();

private:
DISALLOW_COPY_AND_ASSIGN(RGBAShader)
};