Skip to content

Commit

Permalink
WIP - add stem renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
acolombier committed Oct 21, 2024
1 parent a65b3fc commit eed25c8
Show file tree
Hide file tree
Showing 13 changed files with 142 additions and 109 deletions.
9 changes: 7 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3500,8 +3500,7 @@ if (STEM)
if(QML)
target_compile_definitions(mixxx-qml-lib PUBLIC __STEM__)
target_sources(mixxx-qml-lib PRIVATE
# FIXME depends on rendergraph/openglnode.h
# src/waveform/renderers/allshader/waveformrendererstem.cpp
src/waveform/renderers/allshader/waveformrendererstem.cpp
src/qml/qmlstemsmodel.cpp
)
endif()
Expand Down Expand Up @@ -3834,11 +3833,17 @@ endif()
# rendergraph
add_subdirectory(src/rendergraph/opengl)
add_subdirectory(res/shaders/rendergraph)
target_compile_definitions(rendergraph_gl PUBLIC
$<$<CONFIG:Debug>:MIXXX_DEBUG_ASSERTIONS_ENABLED>
)
target_link_libraries(mixxx-lib PUBLIC rendergraph_gl)
target_compile_definitions(mixxx-lib PRIVATE rendergraph=rendergraph_gl)
target_compile_definitions(mixxx-lib PRIVATE allshader=allshader_gl)
if(QML)
add_subdirectory(src/rendergraph/scenegraph)
target_compile_definitions(rendergraph_sg PUBLIC
$<$<CONFIG:Debug>:MIXXX_DEBUG_ASSERTIONS_ENABLED>
)
target_link_libraries(mixxx-qml-lib PRIVATE rendergraph_sg)
target_compile_definitions(mixxx-qml-lib PRIVATE rendergraph=rendergraph_sg)
target_compile_definitions(mixxx-qml-lib PRIVATE allshader=allshader_sg)
Expand Down
2 changes: 2 additions & 0 deletions res/qml/WaveformDisplay.qml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ Item {
highColor: 'blue'
}

Mixxx.WaveformRendererStem { }

Mixxx.WaveformRendererBeat {
color: 'green'
}
Expand Down
5 changes: 4 additions & 1 deletion src/qml/qmlwaveformdisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ QSGNode* QmlWaveformDisplay::updatePaintNode(QSGNode* node, UpdatePaintNodeData*
for (auto* pQmlRenderer : m_waveformRenderers) {

auto renderer = pQmlRenderer->create(this);
if (!renderer.renderer){
continue;
}
addRenderer(renderer.renderer);
m_pTopNode->appendChildNode(std::unique_ptr<rendergraph::BaseNode>(renderer.node));
auto *pWaveformRenderMark =
Expand Down Expand Up @@ -205,7 +208,7 @@ void QmlWaveformDisplay::slotTrackLoaded(TrackPointer pTrack) {

void QmlWaveformDisplay::slotTrackLoading(TrackPointer pNewTrack, TrackPointer pOldTrack) {
Q_UNUSED(pOldTrack); // only used in DEBUG_ASSERT
DEBUG_ASSERT(m_pCurrentTrack == pOldTrack);
DEBUG_ASSERT(getTrackInfo() == pOldTrack);
setCurrentTrack(pNewTrack);
}

Expand Down
24 changes: 13 additions & 11 deletions src/qml/qmlwaveformrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
#include "waveform/renderers/allshader/waveformrendererendoftrack.h"
#include "waveform/renderers/allshader/waveformrendererpreroll.h"
#include "waveform/renderers/allshader/waveformrendererrgb.h"
// #include "waveform/renderers/allshader/waveformrendererstem.h"
#ifdef __STEM__
#include "waveform/renderers/allshader/waveformrendererstem.h"
#endif
#include "waveform/renderers/allshader/waveformrendermark.h"
#include "waveform/renderers/allshader/waveformrendermarkrange.h"

Expand All @@ -34,8 +36,8 @@ QmlWaveformRendererMarkRange::QmlWaveformRendererMarkRange() {
// QmlWaveformRendererSlipMode::QmlWaveformRendererSlipMode() {
// }

// QmlWaveformRendererStem::QmlWaveformRendererStem() {
// }
QmlWaveformRendererStem::QmlWaveformRendererStem() {
}

QmlWaveformRendererMark::QmlWaveformRendererMark()
: m_defaultMark(nullptr), m_untilMark(std::make_unique<QmlWaveformUntilMark>()) {
Expand Down Expand Up @@ -100,14 +102,14 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererMarkRange::create(
// return QmlWaveformRendererFactory::Renderer{renderer, renderer};
// }

// #ifdef __STEM__
// QmlWaveformRendererFactory::Renderer QmlWaveformRendererStem::create(
// WaveformWidgetRenderer* waveformWidget) const {
// auto* renderer = new WaveformRendererStem(
// waveformWidget, ::WaveformRendererAbstract::Play);
// return QmlWaveformRendererFactory::Renderer{renderer, renderer};
// }
// #endif
#ifdef __STEM__
QmlWaveformRendererFactory::Renderer QmlWaveformRendererStem::create(
WaveformWidgetRenderer* waveformWidget) const {
auto* renderer = new WaveformRendererStem(
waveformWidget, ::WaveformRendererAbstract::Play);
return QmlWaveformRendererFactory::Renderer{renderer, renderer};
}
#endif

QmlWaveformRendererFactory::Renderer QmlWaveformRendererMark::create(
WaveformWidgetRenderer* waveformWidget) const {
Expand Down
28 changes: 14 additions & 14 deletions src/qml/qmlwaveformrenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -422,23 +422,23 @@ class QmlWaveformRendererMarkRange
// Renderer create(WaveformWidgetRenderer* waveformWidget) const override;
// };

// class QmlWaveformRendererStem
// : public QmlWaveformRendererFactory {
// Q_OBJECT
// QML_NAMED_ELEMENT(WaveformRendererStem)
class QmlWaveformRendererStem
: public QmlWaveformRendererFactory {
Q_OBJECT
QML_NAMED_ELEMENT(WaveformRendererStem)

// public:
// QmlWaveformRendererStem();
public:
QmlWaveformRendererStem();

// #ifdef __STEM__
// Renderer create(WaveformWidgetRenderer* waveformWidget) const override;
// #else
// Renderer create(WaveformWidgetRenderer* waveformWidget) const override {
// return Renderer{};
// }
#ifdef __STEM__
Renderer create(WaveformWidgetRenderer* waveformWidget) const override;
#else
Renderer create(WaveformWidgetRenderer* waveformWidget) const override {
return Renderer{};
}

// #endif
// };
#endif
};

class QmlWaveformRendererMark
: public QmlWaveformRendererFactory {
Expand Down
2 changes: 1 addition & 1 deletion src/rendergraph/common/rendergraph/material.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class rendergraph::Material : public rendergraph::BaseMaterial {
pOther->m_uniformsCache.data(),
m_uniformsCache.size());
if (cacheCompareResult != 0) {
return cacheCompareResult;
return cacheCompareResult < 0 ? -1 : 1;
}
// TODO multiple textures
if (!texture(0) || !pOther->texture(0)) {
Expand Down
11 changes: 11 additions & 0 deletions src/rendergraph/opengl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,17 @@ target_link_libraries(rendergraph_gl PUBLIC
Qt6::Gui
Qt6::OpenGL
)
find_package(Microsoft.GSL CONFIG)
if(Microsoft.GSL_FOUND)
target_link_libraries(rendergraph_gl PRIVATE Microsoft.GSL::GSL)
else()
# check if the headers have been installed without cmake config (< 3.1.0)
check_include_file_cxx(gsl/gsl HAVE_GSL_GSL)
if(NOT HAVE_GSL_GSL)
unset(HAVE_GSL_GSL CACHE) # unset cache to re-evaluate this until it succeeds. check_include_file_cxx() has no REQUIRED flag.
message(FATAL_ERROR "ms-gsl development headers (libmsgsl-dev) not found")
endif()
endif()
target_compile_definitions(rendergraph_gl PRIVATE rendergraph=rendergraph_gl)

# USE_QSHADER_FOR_GL is set in rendergraph/CMakeLists.txt
Expand Down
4 changes: 2 additions & 2 deletions src/rendergraph/opengl/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ Engine::Engine(std::unique_ptr<BaseNode> pRootNode)
}

Engine::~Engine() {
m_pInitializeNodes.clear();
m_pPreprocessNodes.clear();
// Explicitly remove the root node (and tree from the engine before deallocating its vectors)
remove(m_pRootNode.get());
}

void Engine::add(BaseNode* pNode) {
Expand Down
1 change: 0 additions & 1 deletion src/rendergraph/opengl/rendergraph/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class rendergraph::Engine {
void render();
void resize(int w, int h);
void preprocess();
// FIXME do we expected Engine to take ownership of this ptr?
void add(BaseNode* pNode);
void remove(BaseNode* pNode);
const QMatrix4x4& matrix() const {
Expand Down
2 changes: 1 addition & 1 deletion src/rendergraph/opengl/texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ using namespace rendergraph;

namespace {
QImage premultiplyAlpha(const QImage& image) {
// Since the image is passed by const reference, implicit copy cannot be used, and this Qimage::bits will return a ref the QImage buffer, which may have a shorter lifecycle that the texture buffer. In order to workaround this, and because we cannot copy the image as we need to use the raw bitmap with an explicit image format, we make a manual copy of the buffer
QImage texture(image.width(), image.height(), QImage::Format_RGBA8888);
if (image.format() == QImage::Format_RGBA8888_Premultiplied) {
VERIFY_OR_DEBUG_ASSERT(texture.sizeInBytes() == image.sizeInBytes()){
Expand All @@ -23,7 +24,6 @@ QImage premultiplyAlpha(const QImage& image) {
return texture;
}
std::memcpy(texture.bits(), convertedImage.bits(), texture.sizeInBytes());

}
return texture;
}
Expand Down
11 changes: 11 additions & 0 deletions src/rendergraph/scenegraph/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,17 @@ target_link_libraries(rendergraph_sg PUBLIC
Qt6::Qml
Qt6::Quick
)
find_package(Microsoft.GSL CONFIG)
if(Microsoft.GSL_FOUND)
target_link_libraries(rendergraph_sg PRIVATE Microsoft.GSL::GSL)
else()
# check if the headers have been installed without cmake config (< 3.1.0)
check_include_file_cxx(gsl/gsl HAVE_GSL_GSL)
if(NOT HAVE_GSL_GSL)
unset(HAVE_GSL_GSL CACHE) # unset cache to re-evaluate this until it succeeds. check_include_file_cxx() has no REQUIRED flag.
message(FATAL_ERROR "ms-gsl development headers (libmsgsl-dev) not found")
endif()
endif()
target_compile_definitions(rendergraph_sg PRIVATE rendergraph=rendergraph_sg)

target_include_directories(rendergraph_sg PUBLIC . ../common)
Loading

0 comments on commit eed25c8

Please sign in to comment.