C
Qt Cluster: Rendering and Recovery from Main UI Failure
// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause // This file is part of the Qt Safe Renderer module import QtQuick import "../functions.js" as Functions import ClusterDemo Item { property alias speedValue: speedgauge.speedValue property alias maxValue: speedgauge.maxValue property real outerRadius: Math.min(width, height) * 0.5 Image { id: speedBg anchors.centerIn: parent source: "image://etc/Gauge_Speed.png" } ShaderEffect { id: speedgauge anchors.fill: speedBg property real outerRadius: Math.min(width, height) * 0.5 property int animationDurationSpeed: 500 property real speedValue: 0 property int value: startupAnimationStopped ? ValueSource.kph : speedValue property int minValue: 0 property int maxValue: 240 property int minAngle: 0 property int maxAngle: 270 property real valueInDegrees: ((maxAngle - minAngle) / (maxValue - minValue)) * (value - minValue) property double fCRadSpeed: Functions.degToRad(frontCutSpeed - 180.) property double bCRadSpeed: Functions.degToRad(backCutSpeed - 180.) //Fuel gauge property real valueFuel: ValueSource.fuelLevel property int minAngleFuel: 324 property int maxAngleFuel: 288 property int maxValueFuel: 100 property int animationDurationFuel: 100 property color shaderColorFuel: "#464749" property real valueInDegreesFuel: ((maxAngleFuel - minAngleFuel) / (maxValueFuel - minValue)) * (valueFuel - minValue) property double _acceleratingFuel: (backCutFuel < frontCutFuel) ? 1. : 0. property double frontCutFuel: minAngleFuel + valueInDegreesFuel property double backCutFuel: minAngleFuel property double fCRadFuel: Functions.degToRad(frontCutFuel - 180.) property double bCRadFuel: Functions.degToRad(backCutFuel - 180.) //Shader properties property double frontCutSpeed: minAngle + valueInDegrees// new speed property double backCutSpeed: minAngle //starting point // INTERNAL BELOW property double _acceleratingSpeed: (backCutSpeed < frontCutSpeed) ? 1. : 0. property variant source: speedBg property color shaderColorSpeed: "#E31E24" Behavior on frontCutSpeed { enabled: startupAnimationStopped PropertyAnimation { duration: speedgauge.animationDurationSpeed } } Behavior on frontCutFuel { enabled: startupAnimationStopped PropertyAnimation { duration: speedgauge.animationDurationFuel } } fragmentShader: " varying highp vec2 qt_TexCoord0; uniform lowp sampler2D source; uniform lowp float qt_Opacity; lowp vec4 c = vec4(0.,0.,0.,0.); //Speed uniform lowp vec4 shaderColorSpeed; uniform lowp float frontCutSpeed; uniform lowp float backCutSpeed; uniform lowp float _acceleratingSpeed; uniform highp float fCRadSpeed; uniform highp float bCRadSpeed; //Fuel uniform lowp vec4 shaderColorFuel; uniform lowp float frontCutFuel; uniform lowp float backCutFuel; uniform lowp float _acceleratingFuel; uniform highp float fCRadFuel; uniform highp float bCRadFuel; void main() { highp vec2 uv = vec2(.5 - qt_TexCoord0.y, .5 - qt_TexCoord0.x); lowp float L = length(uv); lowp float f = 1.; f = smoothstep(L - .01, L, .4615); f -= smoothstep(L,L + 0.01, .444); lowp float angle = -atan(uv.y,uv.x); lowp float fspeed = f * mix((1. - step(bCRadSpeed, angle)) * step(fCRadSpeed, angle), (1. - step(fCRadSpeed, angle)) * step(bCRadSpeed, angle), _acceleratingSpeed); if (fspeed > .0) { gl_FragColor = mix(c,shaderColorSpeed,fspeed); return; } lowp float ffuel = f * mix((1. - step(bCRadFuel, angle)) * step(fCRadFuel, angle), (1. - step(fCRadFuel, angle)) * step(bCRadFuel, angle), _acceleratingFuel); if (ffuel > .0) { gl_FragColor = mix(c, shaderColorFuel, ffuel); return; } gl_FragColor = c; } " } Image { id: tyreLight anchors.right: parkingLight.left anchors.bottom: parkingLight.bottom anchors.bottomMargin: 18 source: ValueSource.flatTire ? "image://etc/Icon_TyreMalfunction_ON.png" : "image://etc/Icon_TyreMalfunction_OFF.png" } Image { id: parkingLight anchors.horizontalCenter: parent.horizontalCenter anchors.top: kmText.bottom anchors.topMargin: 20 source: ValueSource.parkingBrake ? "image://etc/Icon_ParkingBrake_ON.png" : "image://etc/Icon_ParkingBrake_OFF.png" } Image { id: fuelLight anchors.left: parkingLight.right anchors.bottom: parkingLight.bottom anchors.bottomMargin: 18 source: (ValueSource.fuelLevel <= 15) ? "image://etc/Icon_Fuel_ON.png" : "image://etc/Icon_Fuel_OFF.png" } }