From 2b1a1525e5fcad950422e94527a62e2efe45ada7 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Thu, 28 Mar 2024 10:38:21 +0100 Subject: [PATCH] Active speaker + Round corners (OpenGL) --- .../participant/ParticipantDeviceCore.cpp | 1 + Linphone/data/CMakeLists.txt | 2 +- Linphone/data/shaders/opacityMask.frag | 16 +++++++ Linphone/data/shaders/opacityMask.frag.qsb | Bin 0 -> 1337 bytes Linphone/data/shaders/roundEffect.frag | 45 ++++++++++++++---- Linphone/data/shaders/roundEffect.frag.qsb | Bin 1620 -> 2957 bytes Linphone/data/shaders/roundEffect.vert | 13 ----- Linphone/data/shaders/roundEffect.vert.qsb | Bin 1170 -> 0 bytes Linphone/view/Item/Contact/Avatar.qml | 13 +++-- Linphone/view/Item/Contact/Sticker.qml | 24 ++++++++-- 10 files changed, 82 insertions(+), 32 deletions(-) create mode 100644 Linphone/data/shaders/opacityMask.frag create mode 100644 Linphone/data/shaders/opacityMask.frag.qsb delete mode 100644 Linphone/data/shaders/roundEffect.vert delete mode 100644 Linphone/data/shaders/roundEffect.vert.qsb diff --git a/Linphone/core/participant/ParticipantDeviceCore.cpp b/Linphone/core/participant/ParticipantDeviceCore.cpp index 591b67e9d..df7d25f0f 100644 --- a/Linphone/core/participant/ParticipantDeviceCore.cpp +++ b/Linphone/core/participant/ParticipantDeviceCore.cpp @@ -46,6 +46,7 @@ ParticipantDeviceCore::ParticipantDeviceCore(const std::shared_ptrgetAddress()->asStringUriOnly()); mIsMuted = device->getIsMuted(); mIsMe = isMe; + mIsSpeaking = device->getIsSpeaking(); mParticipantDeviceModel = Utils::makeQObject_ptr(device); mParticipantDeviceModel->setSelf(mParticipantDeviceModel); mState = LinphoneEnums::fromLinphone(device->getState()); diff --git a/Linphone/data/CMakeLists.txt b/Linphone/data/CMakeLists.txt index a95c3d007..01282f4df 100644 --- a/Linphone/data/CMakeLists.txt +++ b/Linphone/data/CMakeLists.txt @@ -1,7 +1,7 @@ list(APPEND _LINPHONEAPP_RC_FILES data/assistant/use-app-sip-account.rc data/assistant/create-app-sip-account.rc data/assistant/use-other-sip-account.rc - data/shaders/roundEffect.vert.qsb + data/shaders/opacityMask.frag.qsb data/shaders/roundEffect.frag.qsb ) diff --git a/Linphone/data/shaders/opacityMask.frag b/Linphone/data/shaders/opacityMask.frag new file mode 100644 index 000000000..a3dc6c3f6 --- /dev/null +++ b/Linphone/data/shaders/opacityMask.frag @@ -0,0 +1,16 @@ +#version 440 + +layout(location = 0) in vec2 qt_TexCoord0; +layout(location = 0) out vec4 fragColor; + +layout(std140, binding = 0) uniform buf { + mat4 qt_Matrix; + float qt_Opacity; +}; + +layout(binding = 1) uniform sampler2D source; +layout(binding = 2) uniform sampler2D maskSource; + +void main() { + fragColor = texture(source, qt_TexCoord0.st) * (texture(maskSource, qt_TexCoord0.st).a) * qt_Opacity; +} diff --git a/Linphone/data/shaders/opacityMask.frag.qsb b/Linphone/data/shaders/opacityMask.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..deee7fee53b9bab4443ed17190f88c96bd17ef91 GIT binary patch literal 1337 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 SW1s(I7537hvg{9&#Z(;cH$mtC diff --git a/Linphone/data/shaders/roundEffect.vert b/Linphone/data/shaders/roundEffect.vert deleted file mode 100644 index f76842d39..000000000 --- a/Linphone/data/shaders/roundEffect.vert +++ /dev/null @@ -1,13 +0,0 @@ -#version 440 -layout(location = 0) in vec4 qt_Vertex; -layout(location = 1) in vec2 qt_MultiTextCoord0; -layout(location = 0) out vec2 coord; -layout(std140, binding = 0) uniform buf { - mat4 qt_Matrix; - float qt_Opacity; -}; - -void main() { - coord = qt_MultiTextCoord0; - gl_Position = qt_Matrix * qt_Vertex; -} diff --git a/Linphone/data/shaders/roundEffect.vert.qsb b/Linphone/data/shaders/roundEffect.vert.qsb deleted file mode 100644 index b16d3443ae0117dd0f8450ac9d6289f98ef0a784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1170 zcmV;D1a12O01k0@ob6X_ZyQArUcV&87t*9jnzYcCOI=kqM8>fkglZfGrHEE)Gc~gC zJYjE{U=BNB2^+wSvoq$i5zLNR2!9dlu`1bSey71E#|B}XgJ%RY^k*!OOA9!%!PLZwO}4AWN~Czuj|PcxwP0NICzB64`6H zXy9rc6fSAkx(wMJ5$+D*V!rp`{n*GK2=HC1@Tr15BK3NeBP#5I6fhHjqD$QyiWFOGH=DJ##pDA z8x;Qz#oVAh%~6akijkohTT-vaJ&?BvGcRMPz1gN1h<}gj-ywXI?;D(akaDNwhZJj- z>>sjm58?VQ<%a8@K}}gUJ}s#K1vJ^*U4hEhrR#BV-LP&NmX!p&A4Ws;wVm1lXs+Do zngD+R z?U@bSd>{7vu`fzqwQMp+mc-taX}zrIgspG|_XyvttTC~avOB4q$Iv9A$uw>I>Fbwo z&Yj~ZjAQ3zaG40IcG?3{KKtsM<5ug<^QuwUyr_ohzA9`^tX3kXf>Biq0!`2XHmBzX zIXAj zD4H4NE5)2_m3t@!Wn^k9lYC6H;Eb*2mby_M5?>@yFcsv+Ja~EfdZm%wEAqe_Bt75$ zV(1HZ;K0wz0q-7KV|~nry-)F@^6ep9Ix*hEfjjhLI7GfJy&7}wvGkb!rMryWG0Q4u zKCd;~?IeafVGw#jwcP0}Y|nQ4lBQ@hgU*9RhpgRBzc5Nu5$2vW(|*6KgIy`Gv=lWf z>EJfU40RiII(txE0Ae7?dx~8T>*_j`S(MW+1`UW$(|&iO@(Yb#;K9Ns4rkhH`nFci kW=B&$g{qCPkCtQ>bc0Xb;`#@Z`e$vn*=E++A5ZEz-RAs5m;e9( diff --git a/Linphone/view/Item/Contact/Avatar.qml b/Linphone/view/Item/Contact/Avatar.qml index 48147bd57..d35bbd8bb 100644 --- a/Linphone/view/Item/Contact/Avatar.qml +++ b/Linphone/view/Item/Contact/Avatar.qml @@ -124,7 +124,6 @@ StackView { id: avatarItem height: mainItem.height width: height - Image { id: image visible: false @@ -135,16 +134,20 @@ StackView { fillMode: Image.PreserveAspectCrop anchors.centerIn: parent source: mainItem.account && mainItem.account.core.pictureUri - || mainItem.contact && mainItem.contact.core.pictureUri - || computedAvatarUri + || mainItem.contact && mainItem.contact.core.pictureUri + || computedAvatarUri mipmap: true + layer.enabled: true } ShaderEffect { id: roundEffect property variant src: image - property double edge: 0.9 + property real edge: 0.9 + property real edgeSoftness: 0.9 + property real radius: width / 2.0 + property real shadowSoftness: 0.5 + property real shadowOffset: 0.01 anchors.fill: parent - vertexShader: 'qrc:/data/shaders/roundEffect.vert.qsb' fragmentShader: 'qrc:/data/shaders/roundEffect.frag.qsb' } } diff --git a/Linphone/view/Item/Contact/Sticker.qml b/Linphone/view/Item/Contact/Sticker.qml index 8065d3bcc..1928ea48d 100644 --- a/Linphone/view/Item/Contact/Sticker.qml +++ b/Linphone/view/Item/Contact/Sticker.qml @@ -18,6 +18,7 @@ Item { property AccountGui account: null property ParticipantDeviceGui participantDevice: null property bool previewEnabled: false + property bool displayBorder : participantDevice && participantDevice.core.isSpeaking || false property color color: DefaultStyle.grey_600 property int radius: 15 * DefaultStyle.dp property var peerAddressObj: participantDevice && participantDevice.core @@ -32,10 +33,13 @@ Item { Rectangle { id: background - color: mainItem.color + color: noCameraLayout.visible ? mainItem.color : 'transparent' radius: mainItem.radius anchors.fill: parent + border.color: DefaultStyle.main2_200 + border.width: mainItem.displayBorder ? 3 * DefaultStyle.dp : 0 ColumnLayout { + id: noCameraLayout anchors.centerIn: parent visible: !cameraLoader.active || cameraLoader.status != Loader.Ready || !cameraLoader.item.isReady Avatar{ @@ -85,11 +89,11 @@ Item { Item { height: cameraLoader.height width: cameraLoader.width - property bool isReady: cameraItem.visible + property alias isReady: cameraItem.isReady CameraGui{ id: cameraItem anchors.fill: parent - visible: isReady + visible: false call: mainItem.call participantDevice: mainItem.participantDevice isPreview: mainItem.previewEnabled @@ -98,6 +102,20 @@ Item { console.log("Request new renderer") resetTimer.restart() } + layer.enabled: true + } + + ShaderEffect { + id: roundEffect + property variant src: cameraItem + property real edge: 0.9 + property real edgeSoftness: 0.9 + property real radius: mainItem.radius + property real shadowSoftness: 0.5 + property real shadowOffset: 0.01 + anchors.fill: parent + visible: cameraItem.isReady + fragmentShader: 'qrc:/data/shaders/roundEffect.frag.qsb' } } }