Compare commits

...

61 Commits

Author SHA1 Message Date
Uwe Rathmann d1153d3707 Merge branch 'master' into features/effectnode 2025-02-28 09:24:18 +01:00
Uwe Rathmann 3834597d51 Merge branch 'master' into features/effectnode 2025-02-18 16:23:18 +01:00
Uwe Rathmann 4438498e6f Merge branch 'master' into features/effectnode 2025-02-06 13:51:58 +01:00
Uwe Rathmann 92a8c7e395 compiler warnings fixed 2025-02-06 10:25:21 +01:00
Uwe Rathmann e8657d72ff Merge branch 'master' into features/effectnode 2025-02-06 10:21:21 +01:00
Uwe Rathmann c5bdecce00 Merge branch 'master' into features/effectnode 2024-12-10 14:11:51 +01:00
Uwe Rathmann 9cedf5f71b Merge branch 'master' into features/effectnode 2024-12-02 10:11:07 +01:00
Uwe Rathmann f0c8de601f Merge branch 'master' into features/effectnode 2024-09-17 17:42:18 +02:00
Uwe Rathmann 621923c5dd Merge branch 'master' into features/effectnode 2024-09-11 18:21:39 +02:00
Uwe Rathmann c3aea9a4a3 Merge branch 'master' into features/effectnode 2024-01-30 17:10:47 +01:00
Rick Vogel fb4494bdbb fix M_PI by using qmath 2024-01-29 11:57:54 +01:00
Uwe Rathmann 3121f0b5c7 Merge branch 'master' into features/effectnode 2024-01-17 16:06:36 +01:00
Uwe Rathmann cb583abc38 Merge branch 'master' into features/effectnode 2024-01-08 16:33:00 +01:00
Uwe Rathmann 242f063925 building the qsb files with make 2024-01-08 16:32:18 +01:00
Uwe Rathmann d397e4f26a Merge branch 'master' into features/effectnode 2024-01-08 16:09:35 +01:00
Uwe Rathmann 02a63cdd76 using subControlRect 2023-12-29 08:50:46 +01:00
Uwe Rathmann e49da68ab3 Merge branch 'master' into features/effectnode 2023-12-28 17:27:35 +01:00
Uwe Rathmann dd1136a32b Merge branch 'master' into features/effectnode 2023-12-28 17:03:30 +01:00
Uwe Rathmann bba0a680bf blocking updates for nodes that are not part of the QskSceneTexture 2023-12-28 16:57:58 +01:00
Uwe Rathmann 56b1ecf707 comparisonKey fixed 2023-12-28 16:37:13 +01:00
Uwe Rathmann cb9b83bbca returning the effective ( not the intended ) size of the texture 2023-12-28 16:35:27 +01:00
Uwe Rathmann ccb79967f4 update problem with legacy Qt5 OpenGL code fixed 2023-12-28 16:29:29 +01:00
Uwe Rathmann a79650a76e Merge branch 'master' into features/effectnode 2023-12-27 09:02:01 +01:00
Uwe Rathmann ac2ee95962 rgbswap shader also for Qt5 2023-12-27 09:01:37 +01:00
Uwe Rathmann 880ae2abdf Merge branch 'master' into features/effectnode 2023-12-22 14:16:33 +01:00
Uwe Rathmann 6ad68a6da8 Qt5/RHI supported 2023-12-22 13:57:45 +01:00
Uwe Rathmann e1069d9292 Merge branch 'master' into features/effectnode 2023-12-22 13:54:46 +01:00
Uwe Rathmann ec5bb05f4a Merge branch 'master' into features/effectnode 2023-12-21 18:38:57 +01:00
Uwe Rathmann 0b0933122c beatified 2023-12-21 09:04:32 +01:00
Uwe Rathmann 5e0eaf9f6d wip 2023-12-21 09:03:19 +01:00
Uwe Rathmann 4184e4ccf8 wip 2023-12-21 08:58:38 +01:00
Uwe Rathmann 583cf4e87f update issues fixed 2023-12-21 07:14:55 +01:00
Uwe Rathmann f3ee4749b8 Qt5 updates fixed 2023-12-20 11:19:48 +01:00
Uwe Rathmann f9674760c0 Material classes reorganized 2023-12-19 18:37:34 +01:00
Uwe Rathmann 717960f15f texture flip fixed 2023-12-19 12:46:17 +01:00
Uwe Rathmann 862e566507 Squashed commit of the following:
commit 84b7cb31a62edee3ceae702ce52be68cbe222f8a
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 12:30:23 2023 +0100

    wip

commit 07c4b93e0611298e5e3981017c988fc7e45b6977
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 12:21:55 2023 +0100

    wip

commit 019448f5e1ea6eed7b767f09ae7fdb0802928a98
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 12:01:01 2023 +0100

    wip

commit b79f5cba8abc50bd487f08480a62d5c8bcc3c148
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 11:50:55 2023 +0100

    wip

commit 942291edb6016f29fb2f5c786b84fb7defa10ae2
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 11:23:28 2023 +0100

    wip

commit 5ae203a03a8413416f723155bf364190937929da
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 11:23:16 2023 +0100

    wip

commit b5b4453be94c9bdc6655370c949b096061ad1c3a
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 11:04:15 2023 +0100

    wip

commit cd519b840c6436bdec74a6a92cc5ba69a3f162de
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 10:50:13 2023 +0100

    wip

commit 9daed04a2c1dde10340764b6ea7769598edeff3d
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 09:46:10 2023 +0100

    wip

commit c6190b84dde26b4e2790f8154ed3d81db4630b3b
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 09:34:28 2023 +0100

    wip

commit 837b14e8f688a29aa3294eaaa0c0dbfe66f95dce
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 09:23:01 2023 +0100

    wip

commit 6486c343a8cfa2a56370f20374939180b576ce2a
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 08:41:40 2023 +0100

    wip

commit 230aca347b97c0a1bdb75fad6d52153688941aa6
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 08:37:56 2023 +0100

    wip

commit ec4018de7e8d1940a2e693e9e8183413e02f06c2
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 08:33:22 2023 +0100

    wip

commit bc3480a01f34d2e92b2445f5e73c0f12262f63a0
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 08:30:41 2023 +0100

    wip

commit dd896518938f7828f3bc5b5275fccb90d34b08a3
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 07:50:13 2023 +0100

    wip

commit c534c54ff8af674a45669bc4b688f3a28448a055
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Tue Dec 19 07:07:19 2023 +0100

    wip

commit bd7af3f28e8a1a79590acb9be41e0ac9046f1fbc
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 17:50:34 2023 +0100

    wip

commit 639926d3beccdc49aa98db5fe53f5eb70694a763
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 17:48:16 2023 +0100

    wip

commit b74c790aa15a23cf3d5875f6280407170d2113bb
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 17:35:51 2023 +0100

    wip

commit 1403da5a05c5782567b8e34e9a6672e041b483ed
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 16:52:45 2023 +0100

    wip

commit 74d69d44fc8876d95d25c1e5ab96dcf416f93a0e
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 16:04:22 2023 +0100

    wip

commit 81269cab9a4a2f07b86442c0b5524b0364909124
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 15:50:08 2023 +0100

    wip

commit a4f0b8c98960155ee8174e0b5253affc73881158
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 15:49:54 2023 +0100

    wip

commit fc9c5f032671d9b2b8798c97e3803ef8cb98e647
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 15:39:34 2023 +0100

    wip

commit 2ca8789fed5ee98355662933fed04e8ed9b5e164
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 15:28:53 2023 +0100

    wip

commit 3a325b6dab6ee558d6d0407c4e7c639575da4f6d
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 15:24:42 2023 +0100

    wip

commit 102f872db8a158274de674230f23573f941bed23
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 15:22:26 2023 +0100

    wip

commit 829eb67b0e6351e77f702acab90705f3cb3e9b4a
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 14:39:31 2023 +0100

    wip

commit 5f89fc9257fdbd169c5f80d6776aa707848dd5c3
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 14:18:18 2023 +0100

    wip

commit 4b9e2964c3cc3d4b08e55e98ea5b7b06b169b5f2
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 13:21:48 2023 +0100

    wip

commit 8c94d26ed98d906a010401d7357e45249d9b11e8
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 12:42:51 2023 +0100

    wip

commit 096180f6034f93725ebc9d97b8934dcca6e4b41d
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 12:15:04 2023 +0100

    wip

commit f9f794a19e9b9d6455793a6c61c26e5e1d0e12e0
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 11:34:07 2023 +0100

    wip

commit 8b5a8c859503b3b155737b975fb344b2dc87bf94
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 11:32:03 2023 +0100

    wip

commit 67f78561f3bae7c4a779d75921cfabbebf802f9b
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 11:29:32 2023 +0100

    wip

commit ad6515a95ea6803698f76c221c10f4160e82a668
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 11:19:28 2023 +0100

    wip

commit 2e719e809f29f07dc38ae2f3213e10bbb730c968
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 11:16:43 2023 +0100

    wip

commit 2212e09f165130e1621df564aa37bdbefe7377db
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 11:16:00 2023 +0100

    wip

commit 171aae01c802ad10ad268e35da3dcd33fc6c2b6c
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 10:52:06 2023 +0100

    wip

commit ab117a43f0a405f4c09f1c395ab215bbcb09a57e
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Mon Dec 18 10:47:41 2023 +0100

    wip
2023-12-19 12:45:40 +01:00
Uwe Rathmann 361b5d532e BlurringNode -> TextureFilterNode 2023-12-18 09:39:17 +01:00
Uwe Rathmann 0df5775e3e Overlay supports the box model now 2023-12-18 09:02:45 +01:00
Uwe Rathmann d9ebaa8b03 Merge branch 'master' into features/effectnode 2023-12-17 18:13:52 +01:00
Uwe Rathmann 7f410a0781 synced with master 2023-12-17 17:35:30 +01:00
Uwe Rathmann a286603676 Merge branch 'master' into features/effectnode 2023-12-17 17:32:57 +01:00
Uwe Rathmann 26a05e9b7b Merge branch 'master' into features/effectnode 2023-12-17 17:28:50 +01:00
Uwe Rathmann 450d20ec5a Merge branch 'master' into features/effectnode 2023-12-17 17:19:48 +01:00
Uwe Rathmann 908d302236 better no QSGDynamicTexture 2023-12-17 16:20:20 +01:00
Uwe Rathmann 06a32bf29b forgotten changes committed 2023-12-17 15:54:53 +01:00
Uwe Rathmann e75445e17d Overlay as QskControl 2023-12-17 12:33:23 +01:00
Uwe Rathmann e0acd82619 classes moved from parrot to src/nodes 2023-12-16 12:27:09 +01:00
Uwe Rathmann 3e32a14264 using a rgbswap for the moment 2023-12-15 19:16:28 +01:00
Uwe Rathmann 7837ff6c8c SceneTexture is blocking trailing nodes 2023-12-15 12:54:13 +01:00
Uwe Rathmann 728dffd1df work in progress 2023-12-14 13:01:23 +01:00
Uwe Rathmann f4fdc125e6 Squashed commit of the following:
commit 1a5e9421d9d74ebd257fc5404687bd21bea62503
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Thu Dec 14 12:59:10 2023 +0100

    wip

commit db4a97a79ca5ff4f9a39223c7601d5d173862f70
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Thu Dec 14 12:58:42 2023 +0100

    wip

commit 5fc7c8298f26dabd14baca942d854924109d76f2
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Thu Dec 14 12:57:18 2023 +0100

    wip

commit a2a7056a1df69d1fcc5a6de7ebb6c1b99d1bf7eb
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Thu Dec 14 12:50:26 2023 +0100

    wip

commit a35d79069c20e2c76ef92eec308d5eb459f110ec
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Thu Dec 14 12:23:15 2023 +0100

    wip

commit d0828ee074c7a247621590b5575c587e1a876706
Author: Uwe Rathmann <Uwe.Rathmann@tigertal.de>
Date:   Thu Dec 14 11:17:37 2023 +0100

    wip
2023-12-14 13:01:13 +01:00
Uwe Rathmann dda2525970 using QSGGeometry::updateTexturedRectGeometry 2023-12-13 15:09:20 +01:00
Uwe Rathmann 245491724d disable the alpha channel 2023-12-13 07:27:40 +01:00
Uwe Rathmann 048e76d021 using the scene root node 2023-12-12 10:55:30 +01:00
Uwe Rathmann 7615cffdd4 using SceneTexture instead of QSGLayer. blocking the renderer hen
reaching the itemNode is not solved yet
2023-12-11 09:07:56 +01:00
Uwe Rathmann 162534c13c class names shortened 2023-12-08 15:47:32 +01:00
Uwe Rathmann ff1b479938 seems to work now - even when being a child 2023-12-08 15:35:34 +01:00
Uwe Rathmann 725500fdaf some improvement for Overlays being the child of the grabbed item - not
finaly solved
2023-12-07 18:17:41 +01:00
Uwe Rathmann 7f6e77d53d using QSGLayer 2023-12-07 11:24:47 +01:00
Uwe Rathmann 0392f8ea36 Qt6 supported 2023-12-04 12:48:11 +01:00
Uwe Rathmann a90f1c4439 playground/parrots derived from Ricks work 2023-12-03 18:06:34 +01:00
19 changed files with 981 additions and 0 deletions

View File

@ -9,6 +9,7 @@ add_subdirectory(shadows)
add_subdirectory(shapes) add_subdirectory(shapes)
add_subdirectory(charts) add_subdirectory(charts)
add_subdirectory(plots) add_subdirectory(plots)
add_subdirectory(parrots)
if (BUILD_INPUTCONTEXT) if (BUILD_INPUTCONTEXT)
add_subdirectory(inputpanel) add_subdirectory(inputpanel)

View File

@ -0,0 +1,44 @@
############################################################################
# QSkinny - Copyright (C) 2016 Uwe Rathmann
# SPDX-License-Identifier: BSD-3-Clause
############################################################################
set(SOURCES
Overlay.h Overlay.cpp
TextureFilterMaterial.h TextureFilterMaterial.cpp
TextureFilterNode.h TextureFilterNode.cpp
main.cpp)
qt_add_resources(SOURCES images.qrc)
if (QT_VERSION_MAJOR VERSION_LESS 6)
qt_add_resources(SOURCES shaders.qrc)
endif()
qsk_add_example(parrots ${SOURCES})
if (QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
qt6_add_shaders(parrots "shaders"
BATCHABLE
PRECOMPILE
QUIET
PREFIX
"/shaders"
FILES
shaders/blur-vulkan.vert
shaders/blur-vulkan.frag
shaders/rgbswap-vulkan.frag
OUTPUTS
blur.vert.qsb
blur.frag.qsb
rgbswap.vert.qsb
)
endif()

View File

@ -0,0 +1,206 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "Overlay.h"
#include "TextureFilterNode.h"
#include "TextureFilterMaterial.h"
#include <QskSkinlet.h>
#include <QskQuick.h>
#include <QskBoxShapeMetrics.h>
#include <QskBoxBorderMetrics.h>
#include <QskBoxBorderColors.h>
#include <QskGradient.h>
#include <QskSceneTexture.h>
#include <QskSGNode.h>
#include <QskRgbValue.h>
namespace
{
class Material final : public TextureFilterMaterial
{
public:
using TextureFilterMaterial::TextureFilterMaterial;
QSGMaterialType* type() const override
{
static QSGMaterialType staticType;
return &staticType;
}
};
class FilterNode final : public TextureFilterNode
{
public:
FilterNode( bool useRhi, QSGTexture* texture )
{
QString shaders[] = { ":/shaders/blur.vert", ":/shaders/blur.frag" };
if ( useRhi )
{
shaders[0] += ".qsb";
shaders[1] += ".qsb";
}
setFlag( QSGNode::OwnsMaterial, true );
setTextureMaterial( new Material( shaders[0], shaders[1] ) );
setOwnsTexture( true );
setTexture( texture );
}
};
class Skinlet final : public QskSkinlet
{
using Inherited = QskSkinlet;
public:
enum NodeRole { FillRole, BorderRole };
Skinlet()
{
setNodeRoles( { FillRole, BorderRole } );
}
QRectF subControlRect( const QskSkinnable*,
const QRectF& contentsRect, QskAspect::Subcontrol ) const override
{
return contentsRect;
}
QSGNode* updateSubNode( const QskSkinnable* skinnable,
quint8 nodeRole, QSGNode* node ) const override
{
const auto overlay = static_cast< const Overlay* >( skinnable );
switch ( nodeRole )
{
case FillRole:
return updateFillNode( overlay, node );
case BorderRole:
return updateBoxNode( skinnable, node, Overlay::Panel );
};
return nullptr;
}
private:
QSGNode* updateFillNode( const Overlay* overlay, QSGNode* node ) const
{
/*
There should be a way to avoid the clip node by passing the
vertex list directly to the texture node. TODO ...
*/
using Q = Overlay;
QSGNode* clipNode = nullptr;
QSGNode* textureNode = nullptr;
if ( node )
{
if ( node->firstChild() )
{
clipNode = node;
textureNode = node->firstChild();
}
else
{
textureNode = node;
}
}
textureNode = updateTextureNode( overlay, textureNode );
if ( overlay->boxShapeHint( Q::Panel ).isRectangle() )
{
delete clipNode;
clipNode = nullptr;
}
else
{
clipNode = updateBoxClipNode( overlay, clipNode, Q::Panel );
QskSGNode::setParentNode( textureNode, clipNode );
}
return clipNode ? clipNode : textureNode;
}
QSGNode* updateTextureNode( const Overlay* overlay, QSGNode* node ) const
{
const auto window = overlay->window();
const auto rect = overlay->subControlRect( Overlay::Panel );
if ( rect.isEmpty() )
return nullptr;
auto rootNode = qskScenegraphAnchorNode( window );
if ( rootNode == nullptr )
return nullptr;
auto textureNode = static_cast< FilterNode* >( node );
if ( textureNode == nullptr )
{
auto texture = new QskSceneTexture( window );
QObject::connect( texture, &QskSceneTexture::updateRequested,
overlay, &QQuickItem::update );
const bool useRhi = qskRenderingHardwareInterface( window );
textureNode = new FilterNode( useRhi, texture );
}
auto texture = qobject_cast< QskSceneTexture* >( textureNode->texture() );
Q_ASSERT( texture );
if ( texture->isDirty() || rect != textureNode->rect() )
{
texture->setFiltering(
overlay->smooth() ? QSGTexture::Linear : QSGTexture::Nearest );
auto finalNode = const_cast< QSGTransformNode* >( qskItemNode( overlay ) );
texture->render( rootNode, finalNode,
rect.translated( overlay->position() ) );
textureNode->markDirty( QSGNode::DirtyMaterial );
}
textureNode->setRect( rect );
return textureNode;
}
};
}
QSK_SUBCONTROL( Overlay, Panel )
Overlay::Overlay( QQuickItem* parent )
: Inherited( parent )
{
setSkinlet( new Skinlet() );
setBoxBorderMetricsHint( Panel, 1 );
setBoxBorderColorsHint( Panel, QskRgb::toTransparent( QskRgb::DarkGrey, 100 ) );
setBoxShapeHint( Panel, QskBoxShapeMetrics( 25, Qt::RelativeSize ) );
}
Overlay::~Overlay()
{
}
QRectF Overlay::layoutRectForSize( const QSizeF& size ) const
{
return subControlContentsRect( size, Panel );
}
void Overlay::geometryChange(
const QRectF& newGeometry, const QRectF& oldGeometry )
{
Inherited::geometryChange( newGeometry, oldGeometry );
update();
}
#include "moc_Overlay.cpp"

View File

@ -0,0 +1,26 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#pragma once
#include <QskControl.h>
class Overlay : public QskControl
{
Q_OBJECT
using Inherited = QskControl;
public:
QSK_SUBCONTROLS( Panel )
Overlay( QQuickItem* = nullptr );
~Overlay() override;
QRectF layoutRectForSize( const QSizeF& ) const override;
protected:
void geometryChange( const QRectF&, const QRectF& ) override;
};

View File

@ -0,0 +1,216 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "TextureFilterMaterial.h"
#include <qsgmaterial.h>
#include <qsgmaterialshader.h>
#include <qsgtexture.h>
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
#include <qsgmaterialrhishader.h>
using RhiShader = QSGMaterialRhiShader;
#else
using RhiShader = QSGMaterialShader;
#endif
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
namespace
{
class ShaderGL : public QSGMaterialShader
{
public:
void setSource( QOpenGLShader::ShaderType type, const QString& fileName )
{
setShaderSourceFile( type, fileName );
}
char const* const* attributeNames() const override
{
static char const* const names[] = { "in_vertex", "in_coord", nullptr };
return names;
}
void initialize() override
{
QSGMaterialShader::initialize();
auto p = program();
m_matrixId = p->uniformLocation( "matrix" );
m_opacityId = p->uniformLocation( "opacity" );
}
void updateState( const QSGMaterialShader::RenderState& state,
QSGMaterial* newMaterial, QSGMaterial* oldMaterial ) override
{
auto p = program();
if ( state.isMatrixDirty() )
p->setUniformValue( m_matrixId, state.combinedMatrix() );
if ( state.isOpacityDirty() )
p->setUniformValue( m_opacityId, state.opacity() );
auto material = static_cast< TextureFilterMaterial* >( newMaterial );
if ( auto texture = material->texture() )
{
auto textureId = -1;
if ( auto oldMat = static_cast< TextureFilterMaterial* >( oldMaterial ) )
{
if ( oldMat->texture() )
textureId = oldMat->texture()->textureId();
}
if ( texture->textureId() != textureId )
texture->bind();
else
texture->updateBindOptions();
}
}
private:
int m_matrixId = -1;
int m_opacityId = -1;
};
}
#endif
namespace
{
class ShaderRhi : public RhiShader
{
public:
ShaderRhi()
{
setFlag( UpdatesGraphicsPipelineState, true );
}
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
void setSource( QOpenGLShader::ShaderType type, const QString& fileName )
{
setShaderSourceFile( type, fileName );
}
#endif
void setSource( Stage stage, const QString& filename )
{
setShaderFileName( stage, filename );
}
bool updateUniformData( RenderState& state,
QSGMaterial*, QSGMaterial* ) override
{
Q_ASSERT( state.uniformData()->size() >= 68 );
auto data = state.uniformData()->data();
bool changed = false;
if ( state.isMatrixDirty() )
{
const auto matrix = state.combinedMatrix();
memcpy( data + 0, matrix.constData(), 64 );
changed = true;
}
if ( state.isOpacityDirty() )
{
const float opacity = state.opacity();
memcpy( data + 64, &opacity, 4 );
changed = true;
}
return changed;
}
void updateSampledImage( RenderState& state, int binding,
QSGTexture** texture, QSGMaterial* newMaterial, QSGMaterial* ) override
{
Q_UNUSED( binding );
Q_ASSERT( binding == 1 );
auto mat = dynamic_cast< TextureFilterMaterial* >( newMaterial );
if ( auto txt = mat->texture() )
{
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
txt->updateRhiTexture( state.rhi(), state.resourceUpdateBatch() );
#else
txt->commitTextureOperations( state.rhi(), state.resourceUpdateBatch() );
#endif
*texture = txt;
}
}
};
}
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
QSGMaterialShader* TextureFilterMaterial::createShader() const
{
if ( flags() & QSGMaterial::RhiShaderWanted )
{
auto shader = new ShaderRhi();
shader->setSource( ShaderRhi::VertexStage, m_shaderFiles[ 0 ] );
shader->setSource( ShaderRhi::FragmentStage, m_shaderFiles[ 1 ] );
return shader;
}
else
{
auto shader = new ShaderGL();
shader->setSource( QOpenGLShader::Vertex, m_shaderFiles[ 0 ] );
shader->setSource( QOpenGLShader::Fragment, m_shaderFiles[ 1 ] );
return shader;
}
}
#else
QSGMaterialShader* TextureFilterMaterial::createShader(
QSGRendererInterface::RenderMode ) const
{
auto shader = new ShaderRhi();
shader->setSource( ShaderRhi::VertexStage, m_shaderFiles[ 0 ] );
shader->setSource( ShaderRhi::FragmentStage, m_shaderFiles[ 1 ] );
return shader;
}
#endif
TextureFilterMaterial::TextureFilterMaterial(
const QString& vertexShaderFile, const QString& fragmentShaderFile )
: m_shaderFiles{ vertexShaderFile, fragmentShaderFile }
{
setFlag( Blending | RequiresFullMatrix, true );
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
setFlag( SupportsRhiShader, true );
#endif
}
TextureFilterMaterial::~TextureFilterMaterial()
{
}
int TextureFilterMaterial::compare( const QSGMaterial* other ) const
{
auto material = static_cast< const TextureFilterMaterial* >( other );
const auto key1 = texture()->comparisonKey();
const auto key2 = material->texture()->comparisonKey();
return ( key1 == key2 ) ? 0 : ( ( key1 > key2 ) ? 1 : -1 );
}

View File

@ -0,0 +1,36 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#pragma once
#include <qsgmaterial.h>
#include <qstring.h>
class QSGTexture;
class TextureFilterMaterial : public QSGMaterial
{
public:
TextureFilterMaterial( const QString& vertexShaderSourceFile,
const QString& fragmentShaderSourceFile );
~TextureFilterMaterial() override;
int compare( const QSGMaterial* other ) const override;
void setTexture( QSGTexture* texture ) { m_texture = texture; }
QSGTexture* texture() const { return m_texture; }
#if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 )
QSGMaterialShader* createShader(
QSGRendererInterface::RenderMode ) const override final;
#else
QSGMaterialShader* createShader() const override final;
#endif
private:
QSGTexture* m_texture = nullptr;
const QString m_shaderFiles[ 2 ];
};

View File

@ -0,0 +1,104 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include "TextureFilterNode.h"
#include "TextureFilterMaterial.h"
#include <qsgtexture.h>
#include <private/qsgnode_p.h>
class TextureFilterNodePrivate final : public QSGGeometryNodePrivate
{
public:
TextureFilterNodePrivate()
: geometry( QSGGeometry::defaultAttributes_TexturedPoint2D(), 4 )
{
}
QSGGeometry geometry;
QRectF rect;
bool ownsTexture = false;
};
TextureFilterNode::TextureFilterNode()
: QSGGeometryNode( *new TextureFilterNodePrivate )
{
Q_D( TextureFilterNode );
setGeometry( &d->geometry );
setFlag( QSGNode::OwnsMaterial, true );
}
TextureFilterNode::~TextureFilterNode()
{
setTexture( nullptr );
}
void TextureFilterNode::setTextureMaterial( TextureFilterMaterial* material )
{
QSGTexture* texture = nullptr;
if ( auto oldMaterial = textureMaterial() )
texture = oldMaterial->texture();
Inherited::setMaterial( material );
if ( material )
material->setTexture( texture );
}
TextureFilterMaterial* TextureFilterNode::textureMaterial() const
{
return dynamic_cast< TextureFilterMaterial* >( material() );
}
void TextureFilterNode::setTexture( QSGTexture* texture )
{
if ( auto mat = textureMaterial() )
{
if ( ownsTexture() && mat->texture() != texture )
delete mat->texture();
mat->setTexture( texture );
markDirty( QSGNode::DirtyMaterial );
}
}
QSGTexture* TextureFilterNode::texture() const
{
auto mat = textureMaterial();
return mat ? mat->texture() : nullptr;
}
void TextureFilterNode::setRect( const QRectF& rect )
{
Q_D( TextureFilterNode );
if ( rect != d->rect )
{
d->rect = rect;
QSGGeometry::updateTexturedRectGeometry(
&d->geometry, rect, QRectF( 0, 0, 1, 1 ) );
d->geometry.markVertexDataDirty();
markDirty( QSGNode::DirtyGeometry );
}
}
QRectF TextureFilterNode::rect() const
{
return d_func()->rect;
}
void TextureFilterNode::setOwnsTexture( bool on )
{
d_func()->ownsTexture = on;
}
bool TextureFilterNode::ownsTexture() const
{
return d_func()->ownsTexture;
}

View File

@ -0,0 +1,39 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#pragma once
#include <qsgnode.h>
class TextureFilterMaterial;
class TextureFilterNodePrivate;
class QSGTexture;
class TextureFilterNode : public QSGGeometryNode
{
using Inherited = QSGGeometryNode;
public:
TextureFilterNode();
~TextureFilterNode();
void setTexture( QSGTexture* );
QSGTexture* texture() const;
void setOwnsTexture( bool );
bool ownsTexture() const;
void setRect( const QRectF& );
QRectF rect() const;
void setTextureMaterial( TextureFilterMaterial* );
TextureFilterMaterial* textureMaterial() const;
private:
void setMaterial( QSGMaterial* ) = delete;
Q_DECLARE_PRIVATE( TextureFilterNode )
};

View File

@ -0,0 +1,9 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<file>images/parrots.jpg</file>
</qresource>
</RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

179
playground/parrots/main.cpp Normal file
View File

@ -0,0 +1,179 @@
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* SPDX-License-Identifier: BSD-3-Clause
*****************************************************************************/
#include <SkinnyNamespace.h>
#include <QskFunctions.h>
#include <QskLinearBox.h>
#include <QskPushButton.h>
#include <QskQuick.h>
#include <QskWindow.h>
#include <QskGraphicLabel.h>
#include <QskGraphic.h>
#include <QskEvent.h>
#include <QskRgbValue.h>
#include <QGuiApplication>
#include <QDebug>
#include <SkinnyShortcut.h>
#include <qmath.h>
#include "Overlay.h"
class Image : public QskGraphicLabel
{
public:
Image( QQuickItem* parent = nullptr )
: QskGraphicLabel( parent )
{
const QImage image( ":/images/parrots.jpg" );
setGraphic( QskGraphic::fromImage( image ) );
}
};
class ForegroundItem : public QskLinearBox
{
public:
ForegroundItem( QQuickItem* parent = nullptr )
: QskLinearBox( Qt::Vertical, parent )
{
setMargins( 20 );
#if 0
auto label = new Image( this );
label->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed );
label->setLayoutAlignmentHint( Qt::AlignCenter );
label->setObjectName( "miniParrots" );
#endif
auto button = new QskPushButton( "Button", this );
button->setLayoutAlignmentHint( Qt::AlignHCenter | Qt::AlignBottom );
button->setObjectName( "button" );
setObjectName( "foreground" );
}
};
class BackgroundItem : public QskControl
{
using Inherited = QskControl;
public:
BackgroundItem( QQuickItem* parent = nullptr )
: QskControl( parent )
{
setObjectName( "background" );
m_label = new Image( this );
m_label->setFillMode( QskGraphicLabel::Stretch );
m_label->setObjectName( "parrots" );
startTimer( 20 );
}
protected:
void timerEvent( QTimerEvent* ) override
{
updateLabel();
}
void geometryChange( const QRectF& newGeometry,
const QRectF& oldGeometry ) override
{
Inherited::geometryChange( newGeometry, oldGeometry );
updateLabel();
}
private:
void updateLabel()
{
static int counter = 0;
const auto angle = counter++ / 50.0 * M_PI * 2.0;
const auto x = std::cos( angle );
const auto y = std::sin( angle );
const qreal margin = 20;
auto labelRect = rect();
labelRect.adjust( margin, margin, -margin, -margin );
labelRect.translate( margin * x, margin * y );
if ( m_label )
m_label->setGeometry( labelRect );
}
private:
QskGraphicLabel* m_label = nullptr;
};
class MainView : public QskControl
{
public:
MainView( QQuickItem* parent = nullptr )
: QskControl( parent )
{
setPolishOnResize( true );
m_background = new BackgroundItem( this );
#if 0
{
auto box = new QskBox( m_background );
box->setGeometry( 20, 20, 600, 400 );
box->setFillGradient( QskRgb::SaddleBrown );
box->setObjectName( "redBox" );
}
#endif
m_overlay = new Overlay( m_background );
m_overlay->setAutoLayoutChildren( true );
m_overlay->setObjectName( "overlay" );
(void )new ForegroundItem( m_overlay );
#if 0
{
auto box = new QskBox( m_background );
box->setGeometry( 50, 50, 400, 200 );
box->setFillGradient( QskRgb::PaleGreen );
box->setObjectName( "blueBox" );
}
#endif
setObjectName( "mainView" );
}
protected:
void updateLayout() override
{
if ( m_background )
m_background->setGeometry( rect() );
QRectF blurredRect( QPointF(), 0.7 * size() );
blurredRect.moveCenter( rect().center() );
if ( m_overlay )
qskSetItemGeometry( m_overlay, blurredRect );
}
private:
BackgroundItem* m_background = nullptr;
Overlay* m_overlay = nullptr;
};
int main( int argc, char** argv )
{
QGuiApplication app( argc, argv );
SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts );
QskWindow window;
window.setColor( Qt::darkGray );
window.addItem( new MainView( window.contentItem() ) );
window.resize( 800, 600 );
window.show();
return app.exec();
}

View File

@ -0,0 +1,8 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource>
<file>shaders/blur.vert</file>
<file>shaders/blur.frag</file>
<file>shaders/rgbswap.frag</file>
</qresource>
</RCC>

View File

@ -0,0 +1,25 @@
#version 440
layout( location = 0 ) in vec2 coord;
layout( location = 0 ) out vec4 fragColor;
layout( binding = 1 ) uniform sampler2D source;
layout( std140, binding = 0 ) uniform buf
{
mat4 matrix;
float opacity;
} ubuf;
void main()
{
vec2 delta = vec2( 0.01, 0.01 );
fragColor =(
0.0538 * texture( source, coord - 3.182 * delta )
+ 0.3229 * texture( source, coord - 1.364 * delta )
+ 0.2466 * texture( source, coord )
+ 0.3229 * texture( source, coord + 1.364 * delta )
+ 0.0538 * texture( source, coord + 3.182 * delta )
) * ubuf.opacity;
}

View File

@ -0,0 +1,21 @@
#version 440
layout( location = 0 ) in vec4 in_vertex;
layout( location = 1 ) in vec2 in_coord;
layout( location = 0 ) out vec2 coord;
layout( std140, binding = 0 ) uniform buf
{
mat4 matrix;
float opacity;
} ubuf;
out gl_PerVertex { vec4 gl_Position; };
void main()
{
coord = in_coord;
gl_Position = ubuf.matrix * in_vertex;
}

View File

@ -0,0 +1,17 @@
uniform sampler2D source;
uniform lowp float opacity;
varying highp vec2 coord;
void main()
{
vec2 delta = vec2( 0.01, 0.01 );
gl_FragColor =(
0.0538 * texture2D( source, coord - 3.182 * delta )
+ 0.3229 * texture2D( source, coord - 1.364 * delta )
+ 0.2466 * texture2D( source, coord )
+ 0.3229 * texture2D( source, coord + 1.364 * delta )
+ 0.0538 * texture2D( source, coord + 3.182 * delta)
) * opacity;
}

View File

@ -0,0 +1,12 @@
uniform highp mat4 matrix;
attribute highp vec4 in_vertex;
attribute highp vec2 in_coord;
varying highp vec2 coord;
void main()
{
coord = in_coord;
gl_Position = matrix * in_vertex;
}

View File

@ -0,0 +1,18 @@
#version 440
layout( location = 0 ) in vec2 coord;
layout( location = 0 ) out vec4 fragColor;
layout( binding = 1 ) uniform sampler2D source;
layout( std140, binding = 0 ) uniform buf
{
mat4 matrix;
float opacity;
} ubuf;
void main()
{
vec4 c = texture( source, coord );
fragColor = c.yzxw * ubuf.opacity;
}

View File

@ -0,0 +1,10 @@
uniform sampler2D source;
uniform lowp float opacity;
varying highp vec2 coord;
void main()
{
vec4 c = texture2D( source, coord );
gl_FragColor = c.yzxw * opacity;
}

View File

@ -0,0 +1,10 @@
#! /bin/sh
function qsbcompile {
qsbfile=`echo $1 | sed 's/-vulkan//'`
qsb --glsl 100es,120,150 --hlsl 50 --msl 12 -b -o ${qsbfile}.qsb $1
}
qsbcompile blur-vulkan.vert
qsbcompile blur-vulkan.frag
qsbcompile rgbswap-vulkan.frag