diff --git a/src/MediaFX/Transition/GL/CMakeLists.txt b/src/MediaFX/Transition/GL/CMakeLists.txt index d27fc0e..a1c6eb0 100644 --- a/src/MediaFX/Transition/GL/CMakeLists.txt +++ b/src/MediaFX/Transition/GL/CMakeLists.txt @@ -22,6 +22,12 @@ endfunction() process_gltransition_shader(SHADERS gl-transitions/transitions/doorway.glsl gl-transitions/transitions/ripple.glsl + gl-transitions/transitions/windowslice.glsl + gl-transitions/transitions/SimpleZoom.glsl + gl-transitions/transitions/LinearBlur.glsl + gl-transitions/transitions/WaterDrop.glsl + gl-transitions/transitions/GlitchMemories.glsl + gl-transitions/transitions/PolkaDotsCurtain.glsl ) # https://bugreports.qt.io/browse/QTBUG-103723 @@ -31,10 +37,22 @@ qt_add_shaders(gltransition "gltransitionshaders" FILES ${CMAKE_CURRENT_BINARY_DIR}/doorway.glsl.frag ${CMAKE_CURRENT_BINARY_DIR}/ripple.glsl.frag + ${CMAKE_CURRENT_BINARY_DIR}/windowslice.glsl.frag + ${CMAKE_CURRENT_BINARY_DIR}/SimpleZoom.glsl.frag + ${CMAKE_CURRENT_BINARY_DIR}/LinearBlur.glsl.frag + ${CMAKE_CURRENT_BINARY_DIR}/WaterDrop.glsl.frag + ${CMAKE_CURRENT_BINARY_DIR}/GlitchMemories.glsl.frag + ${CMAKE_CURRENT_BINARY_DIR}/PolkaDotsCurtain.glsl.frag gltransition.vert OUTPUTS doorway.frag.qsb ripple.frag.qsb + windowslice.frag.qsb + SimpleZoom.frag.qsb + LinearBlur.frag.qsb + WaterDrop.frag.qsb + GlitchMemories.frag.qsb + PolkaDotsCurtain.frag.qsb gltransition.vert.qsb OUTPUT_TARGETS gltransitionshader_output_targets ) @@ -49,4 +67,10 @@ qt_add_qml_module(gltransition TransitionShaderEffect.qml Doorway.qml Ripple.qml + WindowSlice.qml + SimpleZoom.qml + LinearBlur.qml + WaterDrop.qml + GlitchMemories.qml + PolkaDotsCurtain.qml ) \ No newline at end of file diff --git a/src/MediaFX/Transition/GL/GlitchMemories.qml b/src/MediaFX/Transition/GL/GlitchMemories.qml new file mode 100644 index 0000000..6697f2d --- /dev/null +++ b/src/MediaFX/Transition/GL/GlitchMemories.qml @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Andrew Wason +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick +import MediaFX.Transition as T +import MediaFX.Viewer + +/*! + \qmltype GlitchMemories + \inherits MediaTransition + \inqmlmodule MediaFX.Transition.GL + \brief Implements gl-transitions \l {https://gl-transitions.com/editor/GlitchMemories} {GlitchMemories}. +*/ +T.MediaTransition { + id: root + + TransitionShaderEffect { + sourceItem: root.source + destItem: root.dest + progress: root.time + + fragmentShader: "qrc:/shaders/gltransition/GlitchMemories.frag.qsb" + } +} \ No newline at end of file diff --git a/src/MediaFX/Transition/GL/LinearBlur.qml b/src/MediaFX/Transition/GL/LinearBlur.qml new file mode 100644 index 0000000..db4a70c --- /dev/null +++ b/src/MediaFX/Transition/GL/LinearBlur.qml @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Andrew Wason +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick +import MediaFX.Transition as T +import MediaFX.Viewer + +/*! + \qmltype LinearBlur + \inherits MediaTransition + \inqmlmodule MediaFX.Transition.GL + \brief Implements gl-transitions \l {https://gl-transitions.com/editor/LinearBlur} {LinearBlur}. +*/ +T.MediaTransition { + id: root + + /*! XXX */ + property alias intensity: shader.intensity + + TransitionShaderEffect { + id: shader + property real intensity: 0.1 + + sourceItem: root.source + destItem: root.dest + progress: root.time + + fragmentShader: "qrc:/shaders/gltransition/LinearBlur.frag.qsb" + } + ui: Component { + Column { + spacing: 2 + UIRealSpinBox { + label: "intensity" + initialValue: 0.1 + stepSize: 0.1 + Component.onCompleted: shader.intensity = Qt.binding(() => value) + } + } + } +} \ No newline at end of file diff --git a/src/MediaFX/Transition/GL/PolkaDotsCurtain.qml b/src/MediaFX/Transition/GL/PolkaDotsCurtain.qml new file mode 100644 index 0000000..37d979d --- /dev/null +++ b/src/MediaFX/Transition/GL/PolkaDotsCurtain.qml @@ -0,0 +1,59 @@ +// Copyright (C) 2024 Andrew Wason +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick +import MediaFX.Transition as T +import MediaFX.Viewer + +/*! + \qmltype PolkaDotsCurtain + \inherits MediaTransition + \inqmlmodule MediaFX.Transition.GL + \brief Implements gl-transitions \l {https://gl-transitions.com/editor/PolkaDotsCurtain} {PolkaDotsCurtain}. +*/ +T.MediaTransition { + id: root + + /*! XXX */ + property alias dots: shader.dots + /*! XXX */ + property alias center: shader.center + + TransitionShaderEffect { + id: shader + property real dots: 20.0 + property point center: Qt.point(0, 0) + + sourceItem: root.source + destItem: root.dest + progress: root.time + + fragmentShader: "qrc:/shaders/gltransition/PolkaDotsCurtain.frag.qsb" + } + ui: Component { + Column { + spacing: 2 + UIRealSpinBox { + label: "dots" + initialValue: 20.0 + Component.onCompleted: shader.dots = Qt.binding(() => value) + } + UIRealSpinBox { + label: "center.x" + initialValue: 0 + Component.onCompleted: shader.center.x = Qt.binding(() => value) + stepSize: 0.1 + from: -1.0 + to: 1.0 + } + UIRealSpinBox { + label: "center.y" + initialValue: 0 + Component.onCompleted: shader.center.y = Qt.binding(() => value) + stepSize: 0.1 + from: -1.0 + to: 1.0 + } + } + } +} \ No newline at end of file diff --git a/src/MediaFX/Transition/GL/SimpleZoom.qml b/src/MediaFX/Transition/GL/SimpleZoom.qml new file mode 100644 index 0000000..d3ac0ae --- /dev/null +++ b/src/MediaFX/Transition/GL/SimpleZoom.qml @@ -0,0 +1,41 @@ +// Copyright (C) 2024 Andrew Wason +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick +import MediaFX.Transition as T +import MediaFX.Viewer + +/*! + \qmltype SimpleZoom + \inherits MediaTransition + \inqmlmodule MediaFX.Transition.GL + \brief Implements gl-transitions \l {https://gl-transitions.com/editor/SimpleZoom} {SimpleZoom}. +*/ +T.MediaTransition { + id: root + + /*! XXX */ + property alias zoom_quickness: shader.zoom_quickness + + TransitionShaderEffect { + id: shader + property real zoom_quickness: 0.8 + + sourceItem: root.source + destItem: root.dest + progress: root.time + + fragmentShader: "qrc:/shaders/gltransition/SimpleZoom.frag.qsb" + } + ui: Component { + Column { + spacing: 2 + UIRealSpinBox { + label: "zoom_quickness" + initialValue: 0.8 + stepSize: 0.1 + Component.onCompleted: shader.zoom_quickness = Qt.binding(() => value) + } + } + } +} \ No newline at end of file diff --git a/src/MediaFX/Transition/GL/WaterDrop.qml b/src/MediaFX/Transition/GL/WaterDrop.qml new file mode 100644 index 0000000..c2edc91 --- /dev/null +++ b/src/MediaFX/Transition/GL/WaterDrop.qml @@ -0,0 +1,48 @@ +// Copyright (C) 2024 Andrew Wason +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick +import MediaFX.Transition as T +import MediaFX.Viewer + +/*! + \qmltype WaterDrop + \inherits MediaTransition + \inqmlmodule MediaFX.Transition.GL + \brief Implements gl-transitions \l {https://gl-transitions.com/editor/WaterDrop} {WaterDrop}. +*/ +T.MediaTransition { + id: root + + /*! XXX */ + property alias amplitude: shader.amplitude + /*! XXX */ + property alias speed: shader.speed + + TransitionShaderEffect { + id: shader + property real amplitude: 30 + property real speed: 30 + + sourceItem: root.source + destItem: root.dest + progress: root.time + + fragmentShader: "qrc:/shaders/gltransition/WaterDrop.frag.qsb" + } + ui: Component { + Column { + spacing: 2 + UIRealSpinBox { + label: "amplitude" + initialValue: 30 + Component.onCompleted: shader.amplitude = Qt.binding(() => value) + } + UIRealSpinBox { + label: "speed" + initialValue: 30 + Component.onCompleted: shader.speed = Qt.binding(() => value) + } + } + } +} \ No newline at end of file diff --git a/src/MediaFX/Transition/GL/WindowSlice.qml b/src/MediaFX/Transition/GL/WindowSlice.qml new file mode 100644 index 0000000..b24043f --- /dev/null +++ b/src/MediaFX/Transition/GL/WindowSlice.qml @@ -0,0 +1,50 @@ +// Copyright (C) 2024 Andrew Wason +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick +import MediaFX.Transition as T +import MediaFX.Viewer + +/*! + \qmltype WindowSlice + \inherits MediaTransition + \inqmlmodule MediaFX.Transition.GL + \brief Implements gl-transitions \l {https://gl-transitions.com/editor/windowslice} {WindowSlice}. +*/ +T.MediaTransition { + id: root + + /*! XXX */ + property alias count: shader.count + /*! XXX */ + property alias smoothness: shader.smoothness + + TransitionShaderEffect { + id: shader + property real count: 10.0 + property real smoothness: 0.5 + + sourceItem: root.source + destItem: root.dest + progress: root.time + + fragmentShader: "qrc:/shaders/gltransition/windowslice.frag.qsb" + } + ui: Component { + Column { + spacing: 2 + UIRealSpinBox { + label: "count" + initialValue: 10.0 + Component.onCompleted: shader.count = Qt.binding(() => value) + } + UIRealSpinBox { + label: "smoothness" + initialValue: 0.5 + Component.onCompleted: shader.smoothness = Qt.binding(() => value) + stepSize: 0.1 + to: 1.0 + } + } + } +} \ No newline at end of file diff --git a/src/MediaFX/main.cpp b/src/MediaFX/main.cpp index 3d3e9d1..2fe3d70 100644 --- a/src/MediaFX/main.cpp +++ b/src/MediaFX/main.cpp @@ -149,6 +149,11 @@ int viewer(QGuiApplication& app, QCommandLineParser& parser) qCritical() << "Must specify transition name or QML path."; parser.showHelp(1); } + if (component.isError()) { + for (auto& error : component.errors()) + qCritical() << error; + exit(1); + } engine.rootContext()->setContextProperty(u"transitionComponent"_s, &component); QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app, &QCoreApplication::quit, Qt::QueuedConnection); diff --git a/src/MediaFX/render_session.cpp b/src/MediaFX/render_session.cpp index b35cb73..1478c2a 100644 --- a/src/MediaFX/render_session.cpp +++ b/src/MediaFX/render_session.cpp @@ -101,6 +101,12 @@ void RenderSession::componentComplete() m_outputAudioFormat.setSampleRate(sampleRate()); QQmlComponent component(qmlEngine(this), m_sourceUrl); + if (component.isError()) { + for (auto& error : component.errors()) + qmlWarning(this) << error; + fatalError(); + return; + } QQmlContext* creationContext = component.creationContext(); if (!creationContext) creationContext = qmlContext(this); diff --git a/tests/qml/gl-transitions.qml b/tests/qml/gl-transitions.qml index 6bdd895..4e7e0e2 100644 --- a/tests/qml/gl-transitions.qml +++ b/tests/qml/gl-transitions.qml @@ -16,6 +16,9 @@ MediaSequence { }, Component { Ripple { } + }, + Component { + PolkaDotCurtains { } } ]